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


82

이 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


2
예외는 무엇을 합니까?
SLaks 2011

.NET 4.0에서 XDocument를 사용할 수 있습니까?
JohnD

나는 .NET 3.5에 있습니다! 나는 예외를 썼다!
markzzz 2011

1
예외 메시지 는 무엇입니까 ?
SLaks

XLINQ는 .Net 3.5에서 완벽하게 지원되며 사용하기가 훨씬 쉽습니다.
SLaks

답변:


107

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);
} 

아주 쉽습니다. 마지막으로 API 작업을 시작할 수 있습니다. :).
C4d

7
속성이 아니지만 값이 태그 사이에 있기 때문에 값이 null이기 때문에 또는 대신 SelectSingleNode("//field1").Value이어야 합니다. SelectSingleNode("//field1").InnerTextSelectSingleNode("//field1").InnerXml
Mathias Conradt

3
@MathiasConradt에 추가하려면 myDataz / listS / sog의 첫 번째 항목 SelectSingleNode("field1").InnerText을 항상 읽고 싶지 않은 경우 여야합니다 field1.
Matthieu M.

19

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);
   }

11

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

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

3

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

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

2

목적으로 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;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.