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タグの下の要素のみが必要です。
Elements
メソッドを使用する必要があります。
var accounts = doc.Root.Elements("summary").Elements("account");
または、代わりに、XPathSelectElements
、この場合はより単純です:
var accounts = doc.XPathSelectElements("/data/summary/account");
この場合、Andrew Barberが提案したように、Descendants
を使用することもできますが、一般に、直接の子だけでなく、指定された名前のすべての子孫を本当に見つけたい場合にのみこれを行う必要があります。そうしないと、コードは必要のない多くの検索を実行し、不要な要素を返す可能性があります。
_var accountSummaryElems =
XMLDoc.Element("summary").Elements("account");
_
これにより、account
要素の下にあるsummary
要素のコレクションが得られます。次に、それらを繰り返して値を取得できます。
あなたがいたのと同じパターンを使用するように編集されました。 「account」要素が見つからない場合、そのコードはとにかく実行されないため、First()
の代わりにFirstOrDefault()
を呼び出します。
次に、返されたコレクションを反復処理することで正しいアイデアが得られます。