Загрузить XML-строку с escape-символами

У меня есть строка sMediaXML, которая напоминает фрагмент XML, за исключением того факта, что она содержит escape-символы обратной косой черты. Я не могу загрузить эту строку в 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;
            }
        }
    }
}

person 80sRocker    schedule 30.01.2017    source источник
comment
Я не могу загрузить эту строку в XmlDocument, что позволяет мне проверить и увидеть, существует ли элемент и т. д. - почему? что просходит? в чем собственно проблема?   -  person Marc Gravell    schedule 30.01.2017


Ответы (1)


Вы должны попробовать это:

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, а не Load. Метод Load используется при загрузке напрямую с диска или потоков.
  2. XDocument не может проанализировать строку xml, поскольку она содержит байт UTF-8, указывающий порядок. Подробнее здесь. Для этого есть другой вариант, чтобы просмотреть его, проверьте это ТАК вопрос.
  3. Ваш запрос XPath в любом случае не будет работать, потому что у вас нет определенных "цифровых" элементов.
person Mihail Stancescu    schedule 30.01.2017