1

XML ドキュメントから値を抽出する方法がわかりません。C# を初めて使用するので、助けを求めています。

特定の XML ドキュメントを取得するためにXmlDocument、次に使用していますXmlNodeList

これが私のコードです

XmlNodeList XMLList = doc.SelectNodes("/response/result/doc");

そして、私の XML は次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<response>
<result>
  <doc>
    <long name="LoadID">494</long>
    <long name="EventID">5557</long>
    <str name="XMLData"><TransactionDate>2014-05-28T14:17:31.2186777-06:00</TransactionDate><SubType>tblQM2222Components</SubType><IntegerValue title="ComponentID">11111</IntegerValue></str></doc>
  <doc>
    <long name="LoadID">774</long>
    <long name="EventID">5558</long>
    <str name="XMLData"><TransactionDate>2014-05-28T14:17:31.2186777-06:00</TransactionDate><SubType>tblQM2222Components</SubType><IntegerValue title="ComponentID">11111</IntegerValue></str></doc>
</result>
</response>

これでは、すべてのXMLData下にあるすべてのデータをフェッチする必要がdoc tagあり、最後のドキュメントタグをフェッチする必要がありEventIDます。

4

3 に答える 3

1

2 つの XPath 式を使用して、必要なノードを選択できます。質問の各部分に順番に答えるには:

すべてのXMLDataノードを選択するには:

XmlNodeList XMLList 
      = doc.SelectNodes("/response/result/doc/str[@name='XMLData']");

最後の EventId を選択するには:

XmlNode lastEventIdNode = 
   doc.SelectSingleNode("/response/result/doc[position() = 
                          last()]/long[@name='EventID']");

すべての doc ノードがイベント ID 子ノードを持つことが保証されているわけではない場合は、次のように簡単に実行できます。

XmlNodeList eventIdNodes = 
    doc.SelectNodes("/response/result/doc[long[@name='EventID']]");
XmlNode lastNode = eventIdNodes[eventIdNodes.Count - 1];

それはあなたが求めていたものをあなたに与えるはずです。

アップデート;

各 strXml 要素内に XML データが必要な場合は、InnerXmlプロパティを使用できます。

XmlNodeList xmlList 
      = doc.SelectNodes("/response/result/doc/str[@name='XMLData']");
foreach(XmlNode xmlStrNode in xmlList)
{
    string xmlInner = xmlStrNode.InnerXml;
}
于 2013-05-23T09:48:35.463 に答える
1
var xml = XDocument.Parse(xmlString);

var docs = xml.Root.Elements("doc");

var lastDocEventID = docs.Last()
                         .Elements("long")
                         .First(l => (string)l.Attribute("name") == "EventID")
                         .Value;

Console.WriteLine ("Last doc EventId: " +lastDocEventID);

foreach (var doc in docs)
{
    Console.WriteLine (doc.Element("str").Element("TransactionDate").Value);
}

プリント:

Last doc EventId: 5558
2014-05-28T14:17:31.2186777-06:00
2014-05-28T14:17:31.2186777-06:00
于 2013-05-23T09:21:51.757 に答える
0

resultxml に短いタグが 1 つあります。

これを使ってみてください。それはあまりにもきれいです私見

XmlNodeList docs = doc.SelectSingleNode("response").SelectSingleNode("result").SelectNodes("doc");

次に、、、の組み合わせを使用してSelectSingleNode、リスト内の各 XmlNode からデータを取得できます。InnerTextValue

たとえば、最初のdocタグから EventID が必要な場合:

int eventID = int.Parse(docs[0].SelectSingleNode("long[@name='EventID']").InnerText);
于 2013-05-23T09:17:45.183 に答える