2017-01-30 1 views
0

J'ai une chaîne sMediaXML qui ressemble à un fragment XML, sauf qu'elle contient des caractères d'échappement de barre oblique inverse. Je suis incapable de charger cette chaîne dans un XmlDocument me permettant de vérifier et voir si un élément existe etc ... Je dois garder le format de chaîne exactement comme vous le voyez ci-dessous car d'autres codes en dépendront plus tard.Charger une chaîne XML ayant des caractères d'échappement

// 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; 
      } 
     } 
    } 
} 
+0

"Je ne parviens pas à charger cette chaîne dans un XmlDocument, ce qui me permet de vérifier et de voir si un élément existe etc ..." - pourquoi? ce qui se produit? quel est le problème réel? –

Répondre

1

Vous devriez essayer ceci:

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. Si vous avez une chaîne XML que vous voulez charger dans un XDocument vous devez utiliser la méthode LoadXml pas Load. La méthode Load est utilisée lors du chargement directement à partir du disque ou des flux.
  2. Le XDocument ne peut pas analyser la chaîne XML car il contient l'octet UTF-8 spécifiant l'ordre. Plus d'informations here. Il y a une autre option pour que cela fonctionne, pour l'afficher, vérifiez ceci SO question.
  3. La requête XPath que vous avez ne fonctionnera pas car vous n'avez aucun élément "numérique" défini.