[c#] XML (문자열에서) 읽기 및 일부 필드 가져 오기-XML 읽기 문제

이 XML이 있습니다 (라는 C # 문자열에 저장 됨 myXML)

<?xml version="1.0" encoding="utf-16"?>
<myDataz xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <listS>
    <sog>
      <field1>123</field1>
      <field2>a</field2>
      <field3>b</field3>
    </sog>
    <sog>
      <field1>456</field1>
      <field2>c</field2>
      <field3>d</field3>
    </sog>
  </listS>
</myDataz>

모든 <sog>요소 를 탐색하고 싶습니다 . 각각에 대해 아이를 인쇄하고 싶습니다 <field1>.

그래서 이것은 내 코드입니다.

XmlDocument xmlDoc = new XmlDocument();
string myXML = "<?xml version=\"1.0\" encoding=\"utf-16\"?><myDataz xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"><listS><sog><field1>123</field1><field2>a</field2><field3>b</field3></sog><sog><field1>456</field1><field2>c</field2><field3>d</field3></sog></listS></myDataz>"
xmlDoc.Load(myXML);
XmlNodeList parentNode = xmlDoc.GetElementsByTagName("listS");
foreach (XmlNode childrenNode in parentNode)
{
    HttpContext.Current.Response.Write(childrenNode.SelectSingleNode("//field1").Value);
}

하지만 문자열을 XML로 읽을 수 없습니까? 나는 얻다System.ArgumentException



답변

Load가 아닌 LoadXml 메서드를 사용해야합니다.

xmlDoc.LoadXml(myXML);

Load 메서드는 파일에서 xml을로드하고 문자열에서 LoadXml을로드하려고합니다. XPath를 사용할 수도 있습니다.

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xml);

string xpath = "myDataz/listS/sog";
var nodes = xmlDoc.SelectNodes(xpath);

foreach (XmlNode childrenNode in nodes)
{
    HttpContext.Current.Response.Write(childrenNode.SelectSingleNode("//field1").Value);
}


답변

Linq-XML 사용,

XDocument doc = XDocument.Load(file);

var result = from ele in doc.Descendants("sog")
              select new
              {
                 field1 = (string)ele.Element("field1")
              };
 foreach (var t in result)
  {
      HttpContext.Current.Response.Write(t.field1);
  }

OR : <sog>태그 의 노드 목록을 가져옵니다 .

 XmlDocument xmlDoc = new XmlDocument();
 xmlDoc.Load(myXML);
 XmlNodeList parentNode = xmlDoc.GetElementsByTagName("sog");
 foreach (XmlNode childrenNode in parentNode)
  {
    HttpContext.Current.Response.Write(childrenNode.SelectSingleNode("field1").InnerText);
   }


답변

다른 답변은 몇 년 전 (Windows Phone 8.1에서는 작동하지 않음)이므로 다른 옵션을 선택해야한다고 생각했습니다. Windows Phone 앱에 대한 RSS 응답을 구문 분석하는 데 사용했습니다.

XDocument xdoc = new XDocument();
xdoc = XDocument.Parse(xml_string);


답변

또는 XmlSerializer 클래스를 사용하십시오.

XmlSerializer xs = new XmlSerializer(objectType);
obj = xs.Deserialize(new StringReader(yourXmlString));


답변

목적으로 System.Xml.Linq.XElement를 사용했습니다. xml의 ​​첫 번째 자식 노드 (루트 노드가 아님)의 값을 읽으려면 아래 코드를 확인하십시오.

        string textXml = "<xmlroot><firstchild>value of first child</firstchild>........</xmlroot>";
        XElement xmlroot = XElement.Parse(textXml);
        string firstNodeContent = ((System.Xml.Linq.XElement)(xmlroot.FirstNode)).Value;


답변