web-dev-qa-db-ja.com

LinqとXDocumentを使用して、親タグの下にあるすべての子要素を取得できますか?

XMLを持っています

<data>
  <summary>
    <account curr_desc='USD' acct_nbr='123' net='1000.00' />
    <account curr_desc='USD' acct_nbr='456' net='2000.00' />
  </summary>
  <details>
    <accounts>
      <account acct_nbr="123" curr="USD">
        <activity color='False' settle_date='02 Jul 2010' amt='580.00' />
        <activity color='True' settle_date='09 Jul 2010' amt='420.00' />
      </account>
      <account acct_nbr="456" curr="USD">
        <activity color='True' settle_date='12 Dec 2010' amt='1500.00' />
        <activity color='True' settle_date='19 Dec 2010' amt='500.00' />
      </account>
    </accounts>
  </details>
</data>

LinqとXDocumentを使用して、「概要」情報を抽出できますが、「概要」タグの下の「アカウント」情報を抽出するにはどうすればよいですか?

XDocument XMLDoc = XDocument.Load("testdata.xml");
XElement accounts = (from xml2 in XMLDoc.Descendants("summary")
                    select xml2).FirstOrDefault();

summary/account」のようなものを指定して、<summary>の下のすべての要素を返すにはどうすればよいですか? <account>の下に<detail><accounts>があることに注意してください。summaryタグの下の要素のみが必要です。

9
Sri Reddy

Elementsメソッドを使用する必要があります。

var accounts = doc.Root.Elements("summary").Elements("account");

または、代わりに、XPathSelectElements、この場合はより単純です:

var accounts = doc.XPathSelectElements("/data/summary/account");

この場合、Andrew Barberが提案したように、Descendantsを使用することもできますが、一般に、直接の子だけでなく、指定された名前のすべての子孫を本当に見つけたい場合にのみこれを行う必要があります。そうしないと、コードは必要のない多くの検索を実行し、不要な要素を返す可能性があります。

20
Robert Rossney
_var accountSummaryElems = 
   XMLDoc.Element("summary").Elements("account");
_

これにより、account要素の下にあるsummary要素のコレクションが得られます。次に、それらを繰り返して値を取得できます。

あなたがいたのと同じパターンを使用するように編集されました。 「account」要素が見つからない場合、そのコードはとにかく実行されないため、First()の代わりにFirstOrDefault()を呼び出します。

次に、返されたコレクションを反復処理することで正しいアイデアが得られます。

3
Andrew Barber