XPath と LINQ to XML は、いくつかの点で似ています。 どちらも XML ツリーのクエリに使用でき、要素のコレクション、属性のコレクション、ノードのコレクション、要素または属性の値などの結果を返します。 ただし、2 つのオプションには大きな違いがあります。
XPath と LINQ to XML の違い
XPath では、新しい型のプロジェクションは許可されません。 ツリーからノードのコレクションのみを返すことができますが、LINQ to XML ではクエリを実行し、オブジェクト グラフまたは XML ツリーを新しい図形に投影できます。 LINQ to XML クエリは、XPath 式よりもはるかに多くのことを実行できます。
XPath 式は、文字列内で分離して存在します。 C# コンパイラでは、コンパイル時に XPath 式を解析できません。 これに対し、LINQ to XML クエリは C# コンパイラによって解析およびコンパイルされます。 コンパイラは、多くのクエリ エラーをキャッチできます。
XPath の結果は厳密に型指定されていません。 多くの場合、XPath 式を評価した結果はオブジェクトであり、適切な型を決定し、必要に応じて結果をキャストするのは開発者の判断です。 これに対し、LINQ to XML クエリからのプロジェクションは厳密に型指定されています。
結果の順序付け
XPath 1.0 Recommendation は、XPath 式の評価結果であるコレクションが順序付けられていないことを示しています。
ただし、LINQ to XML XPath 軸メソッドによって返されるコレクションを反復処理すると、コレクション内のノードはドキュメントの順序で返されます。 これは、 preceding
や preceding-sibling
など、逆のドキュメントの順序で述語が表される XPath 軸にアクセスする場合でも当てはまる場合です。
これに対し、LINQ to XML 軸のほとんどは、ドキュメントの順序でコレクションを返します。 ただし、そのうちの 2 つの Ancestors と AncestorsAndSelfは、逆のドキュメントの順序でコレクションを返します。 次の表は、軸を列挙し、それぞれのコレクションの順序を示しています。
LINQ to XML 軸 | 注文 |
---|---|
XContainer.DescendantNodes | ドキュメントの順序 |
XContainer.Descendants | ドキュメントの順序 |
XContainer.Elements | ドキュメントの順序 |
XContainer.Nodes | ドキュメントの順序 |
XContainer.NodesAfterSelf | ドキュメントの順序 |
XContainer.NodesBeforeSelf | ドキュメントの順序 |
XElement.AncestorsAndSelf | ドキュメントの順序を逆にする |
XElement.Attributes | ドキュメントの順序 |
XElement.DescendantNodesAndSelf | ドキュメントの順序 |
XElement.DescendantsAndSelf | ドキュメントの順序 |
XNode.Ancestors | ドキュメントの順序を逆にする |
XNode.ElementsAfterSelf | ドキュメントの順序 |
XNode.ElementsBeforeSelf | ドキュメントの順序 |
XNode.NodesAfterSelf | ドキュメントの順序 |
XNode.NodesBeforeSelf | ドキュメントの順序 |
位置述語
XPath 式内では、位置述語は多くの軸のドキュメントの順序で表されますが、逆の軸の場合は逆のドキュメントの順序で表されます。 逆軸は、 preceding
、 preceding-sibling
、 ancestor
、および ancestor-or-self
です。 たとえば、XPath 式 preceding-sibling::*[1]
は直前の兄弟を返します。 これは、最終的な結果セットがドキュメントの順序で表示される場合でも当てはまる場合です。
これに対し、LINQ to XML のすべての位置述語は、軸の順序で常に表されます。 たとえば、 anElement.ElementsBeforeSelf().ElementAt(0)
は、直前の兄弟ではなく、クエリ対象の要素の親の最初の子要素を返します。 別の例: anElement.Ancestors().ElementAt(0)
は親要素を返します。
LINQ to XML で直前の要素を検索する場合は、次の式を記述します。
ElementsBeforeSelf().Last()
ElementsBeforeSelf().Last()
パフォーマンスの違い
LINQ to XML で XPath 機能を使用する XPath クエリは、LINQ to XML クエリよりも遅くなります。
コンポジションの比較
LINQ to XML クエリの構成は XPath 式の構成に似ていますが、構文は大きく異なります。
たとえば、customers
という名前の変数に要素があり、Customer
という名前のすべての子要素の下に CompanyName
という名前の孫要素を見つける場合は、次の XPath 式を記述します。
customers.XPathSelectElements("./Customer/CompanyName")
customers.XPathSelectElements("./Customer/CompanyName")
同等の LINQ to XML クエリは次のとおりです。
customers.Elements("Customer").Elements("CompanyName")
customers.Elements("Customer").Elements("CompanyName")
XPath 軸ごとに同様の平行線があります。
XPath 軸 | LINQ to XML 軸 |
---|---|
child (既定の軸) | XContainer.Elements |
親 (...) | XObject.Parent |
属性軸 (@) | XElement.Attribute 又は XElement.Attributes |
先祖軸 | XNode.Ancestors |
先祖軸または自己軸 | XElement.AncestorsAndSelf |
子孫軸 (//) | XContainer.Descendants 又は XContainer.DescendantNodes |
descendant-or-self | XElement.DescendantsAndSelf 又は XElement.DescendantNodesAndSelf |
following-sibling | XNode.ElementsAfterSelf 又は XNode.NodesAfterSelf |
preceding-sibling | XNode.ElementsBeforeSelf 又は XNode.NodesBeforeSelf |
次 | 直接同等の値はありません。 |
先行 | 直接同等の値はありません。 |
.NET