次の方法で共有


XPath と LINQ to XML の比較

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 軸メソッドによって返されるコレクションを反復処理すると、コレクション内のノードはドキュメントの順序で返されます。 これは、 precedingpreceding-siblingなど、逆のドキュメントの順序で述語が表される XPath 軸にアクセスする場合でも当てはまる場合です。

これに対し、LINQ to XML 軸のほとんどは、ドキュメントの順序でコレクションを返します。 ただし、そのうちの 2 つの AncestorsAncestorsAndSelfは、逆のドキュメントの順序でコレクションを返します。 次の表は、軸を列挙し、それぞれのコレクションの順序を示しています。

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 式内では、位置述語は多くの軸のドキュメントの順序で表されますが、逆の軸の場合は逆のドキュメントの順序で表されます。 逆軸は、 precedingpreceding-siblingancestor、および 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
直接同等の値はありません。
先行 直接同等の値はありません。