加载 XML 具有转义字符的字符串
Load XML String having escape characters
我有一个类似于 XML 片段的字符串 sMediaXML
,只是它包含反斜杠转义字符。我无法将此字符串加载到 XmlDocument
中,使我能够检查并查看元素是否存在等...我需要保持字符串格式与您在下面看到的完全相同,因为其他代码稍后将依赖于它.
// sMediaXML = "<media><cd><burned value=\"true\" /></cd><vinyl><pressed value=\"true\" /></vinyl></media>"
using System;
using System.IO;
using System.Text;
using System.Xml;
namespace xmlWriter_Console
{
class Program
{
static void Main(string[] args)
{
XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
settings.ConformanceLevel = ConformanceLevel.Fragment;
settings.CloseOutput = false;
MemoryStream strm = new MemoryStream();
using (XmlWriter writer = XmlWriter.Create(strm, settings))
{
writer.WriteStartElement("media");
writer.WriteStartElement("cd");
writer.WriteStartElement("burned");
writer.WriteAttributeString("value", "true");
writer.WriteEndElement();
writer.WriteEndElement();
writer.WriteStartElement("vinyl");
writer.WriteStartElement("pressed");
writer.WriteAttributeString("value", "true");
writer.WriteEndElement();
writer.WriteEndElement();
writer.WriteEndElement();
}
string sMediaXML = Encoding.UTF8.GetString((strm).ToArray());
Boolean bNodeExists;
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(sMediaXML);
if (xmlDoc.SelectSingleNode("/media/digital/@value").Value != null)
{
bNodeExists = true;
}
else
{
bNodeExists = false;
}
}
}
}
你应该试试这个:
XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
settings.ConformanceLevel = ConformanceLevel.Document;
settings.CloseOutput = false;
MemoryStream strm = new MemoryStream();
using (XmlWriter writer = XmlWriter.Create(strm, settings))
{
writer.WriteStartElement("media");
writer.WriteStartElement("cd");
writer.WriteStartElement("burned");
writer.WriteAttributeString("value", "true");
writer.WriteEndElement();
writer.WriteEndElement();
writer.WriteStartElement("vinyl");
writer.WriteStartElement("pressed");
writer.WriteAttributeString("value", "true");
writer.WriteEndElement();
writer.WriteEndElement();
writer.WriteEndElement();
}
string sMediaXML = Encoding.UTF8.GetString((strm).ToArray());
Boolean bNodeExists;
string _byteOrderMarkUtf8 = Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble());
if (sMediaXML.StartsWith(_byteOrderMarkUtf8))
{
sMediaXML = sMediaXML.Remove(0, _byteOrderMarkUtf8.Length);
}
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(sMediaXML);
if (xmlDoc.SelectSingleNode("/media/cd/burned/@value").Value != null)
{
bNodeExists = true;
}
else
{
bNodeExists = false;
}
- 如果要将 XML 字符串加载到
XDocument
中,则应使用 LoadXml
方法而不是 Load
。 Load
方法用于直接从磁盘或流加载。
XDocument
无法解析 xml 字符串,因为它包含指定顺序的 UTF-8 字节。更多信息 here. There is an other option for this to work, to view it, check this SO question.
- 您的
XPath
查询无论如何都不会工作,因为您没有定义任何 "digital" 元素。
我有一个类似于 XML 片段的字符串 sMediaXML
,只是它包含反斜杠转义字符。我无法将此字符串加载到 XmlDocument
中,使我能够检查并查看元素是否存在等...我需要保持字符串格式与您在下面看到的完全相同,因为其他代码稍后将依赖于它.
// sMediaXML = "<media><cd><burned value=\"true\" /></cd><vinyl><pressed value=\"true\" /></vinyl></media>"
using System;
using System.IO;
using System.Text;
using System.Xml;
namespace xmlWriter_Console
{
class Program
{
static void Main(string[] args)
{
XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
settings.ConformanceLevel = ConformanceLevel.Fragment;
settings.CloseOutput = false;
MemoryStream strm = new MemoryStream();
using (XmlWriter writer = XmlWriter.Create(strm, settings))
{
writer.WriteStartElement("media");
writer.WriteStartElement("cd");
writer.WriteStartElement("burned");
writer.WriteAttributeString("value", "true");
writer.WriteEndElement();
writer.WriteEndElement();
writer.WriteStartElement("vinyl");
writer.WriteStartElement("pressed");
writer.WriteAttributeString("value", "true");
writer.WriteEndElement();
writer.WriteEndElement();
writer.WriteEndElement();
}
string sMediaXML = Encoding.UTF8.GetString((strm).ToArray());
Boolean bNodeExists;
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(sMediaXML);
if (xmlDoc.SelectSingleNode("/media/digital/@value").Value != null)
{
bNodeExists = true;
}
else
{
bNodeExists = false;
}
}
}
}
你应该试试这个:
XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
settings.ConformanceLevel = ConformanceLevel.Document;
settings.CloseOutput = false;
MemoryStream strm = new MemoryStream();
using (XmlWriter writer = XmlWriter.Create(strm, settings))
{
writer.WriteStartElement("media");
writer.WriteStartElement("cd");
writer.WriteStartElement("burned");
writer.WriteAttributeString("value", "true");
writer.WriteEndElement();
writer.WriteEndElement();
writer.WriteStartElement("vinyl");
writer.WriteStartElement("pressed");
writer.WriteAttributeString("value", "true");
writer.WriteEndElement();
writer.WriteEndElement();
writer.WriteEndElement();
}
string sMediaXML = Encoding.UTF8.GetString((strm).ToArray());
Boolean bNodeExists;
string _byteOrderMarkUtf8 = Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble());
if (sMediaXML.StartsWith(_byteOrderMarkUtf8))
{
sMediaXML = sMediaXML.Remove(0, _byteOrderMarkUtf8.Length);
}
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(sMediaXML);
if (xmlDoc.SelectSingleNode("/media/cd/burned/@value").Value != null)
{
bNodeExists = true;
}
else
{
bNodeExists = false;
}
- 如果要将 XML 字符串加载到
XDocument
中,则应使用LoadXml
方法而不是Load
。Load
方法用于直接从磁盘或流加载。 XDocument
无法解析 xml 字符串,因为它包含指定顺序的 UTF-8 字节。更多信息 here. There is an other option for this to work, to view it, check this SO question.- 您的
XPath
查询无论如何都不会工作,因为您没有定义任何 "digital" 元素。