加载 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;
}
  1. 如果要将 XML 字符串加载到 XDocument 中,则应使用 LoadXml 方法而不是 LoadLoad 方法用于直接从磁盘或流加载。
  2. XDocument 无法解析 xml 字符串,因为它包含指定顺序的 UTF-8 字节。更多信息 here. There is an other option for this to work, to view it, check this SO question.
  3. 您的 XPath 查询无论如何都不会工作,因为您没有定义任何 "digital" 元素。