2017-01-30 2 views
0

문자열에 백 슬래시 이스케이프 문자가 포함되어 있다는 것을 제외하고는 XML 부분과 유사한 문자열 sMediaXML이 있습니다. 이 문자열을 XmlDocument에로드 할 수 없으므로 요소가 있는지 등을 확인하고 확인할 수 있습니다 ... 나중에 다른 코드가 나중에 사용되기 때문에 아래에서 보는 것처럼 문자열 형식을 정확하게 유지해야합니다.이스케이프 문자가있는 XML 문자열로드

// 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

"이 문자열을 XmlDocument에로드 할 수 없어 요소를 확인하고 확인할 수 있습니다."- 이유가 무엇입니까? 무슨 일이야? 실제 문제는 무엇입니까? –

답변

1

이 작업을 시도해야합니다 : 당신이 XDocument에로드 할 XML 문자열이있는 경우

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. 당신이 LoadXml 방법이 아니다 Load을 사용해야합니다. Load 메서드는 디스크 나 스트림에서 직접로드 할 때 사용됩니다.
  2. XDocument은 순서를 지정하는 UTF-8 바이트를 포함하고 있기 때문에 xml 문자열을 구문 분석 할 수 없습니다. 자세한 내용 here. 이 기능이 작동하려면 다른 옵션이 있습니다. 확인하려면 SO question을 확인하십시오.
  3. "디지털"요소가 정의되어 있지 않으므로 가지고있는 XPath 쿼리는 작동하지 않습니다.