さて LINQ の式にスポットを当ててみましょう。
Elements メソッドは子要素の IEnumerable<XElement> を取得します。
引数に XName を渡すと、指定のの名前の要素のみ列挙します。
もっと複雑な取得方法もできます。
たとえばこんな XML に対して同じことをしてみましょう。
<?xml version="1.0" encoding="UTF-8"?>
<root>
<child>
<item key="11">1-1</item>
<item key="12">1-2</item>
<item key="13">1-3</item>
</child>
<child>
<item key="21">2-1</item>
<item key="22">2-2</item>
<item key="23">2-3</item>
</child>
<child>
<item key="31">3-1</item>
<item key="32">3-2</item>
<item key="33">3-3</item>
</child>
</root>
Elements メソッドを使うとこうなります。
IEnumerable<XElement> elements =
from child in documentElement.Elements()
from item in documentElement.Elements()
where item.Attribute("key").Value.EndsWith("1")
select item;
ところが DescendantsAndSelf というメソッドがありまして、これを使うと下記の様にできます。
IEnumerable<XElement> elements =
from item in documentElement.DescendantsAndSelf("item")
where item.Attribute("key").Value.EndsWith("1")
select item;
ピンと来た方もいらっしゃるでしょう。
XPath には軸という概念があります。
で、この軸ごとにメソッドがあるみたいです。
ざっと列挙すると
メソッド | 軸 |
Elements | child |
Attributes | attribute |
Ancestors | ancestor |
AncestorsAndSelf | ancestor-or-self |
Descendants | descendant |
DescendantsAndSelf | descendant-or-self |
NodesAfterSelf | following-sibiling |
NodesBeforeSelf | preceding-sibiling |
こんな感じかなぁ、全部の軸はなさげですね。(following とかは 親を取得してやれってことかな?)
軸名とメソッド名がリンクしていないのが惜しいです・・・・