コンパイルされた XPath 式
XPathExpression オブジェクトは、XPathExpression クラスの静的 Compile メソッドまたは XPathNavigator クラスの Compile メソッドから返されるコンパイル済み XPath クエリを表します。
XPathExpression クラス
XPathExpression オブジェクトにより表されるコンパイル済み XPath クエリは、同じ XPath クエリが複数回使用されるときに有用です。
たとえば、Select メソッドを複数回呼び出すとき、毎回 XPath クエリを表す文字列を使用する代わりに、再使用とパフォーマンスの向上のために、XPathExpression クラスの Compile メソッド、または XPathNavigator クラスの Compile メソッドを使用して、XPath クエリを XPathExpression オブジェクトにコンパイルしてキャッシュします。
いったんコンパイルされると、XPathExpression オブジェクトは、XPath クエリから返される型に応じて、次の XPathNavigator クラス メソッドの入力として使用することができます。
次の表では、W3C XPath の戻り型、それに等価の Microsoft .NET Framework 型、および戻り型に応じて XPathExpression オブジェクトで使用できるメソッドについて説明します。
W3C XPath の戻り型 |
.NET Framework の等価の型 |
説明 |
メソッド |
---|---|---|---|
Node set |
重複がなく順序付けされていない、ドキュメント順に作成されたノードのコレクション。 |
||
Boolean |
true または false の値。 |
Evaluate または |
|
Number |
浮動小数点数。 |
||
String |
UCS 文字のシーケンス。 |
メモ |
---|
Matches メソッドは、XPath 式をパラメーターとして受け取ります。SelectSingleNode メソッドは W3C XPath の戻り型の 1 つではなく、1 つの XPathNavigator オブジェクトを返します。 |
戻り型のプロパティ
XPath クエリが XPathExpression オブジェクトにコンパイルされた後、XPathExpression オブジェクトの ReturnType プロパティを使用して、XPath クエリで何が返されるかを知ることができます。
ReturnType プロパティは、W3C XPath 戻り値を表す、次の XPathResultType 列挙値の 1 つを返します。
次の例は、XPathExpression オブジェクトを使用して、books.xml ファイルから 1 つの数値とノード セットを返します。 各 XPathExpression オブジェクトの ReturnType プロパティと共に、Evaluate および Select メソッドからの結果がコンソールに出力されます。
Dim document As XPathDocument = New XPathDocument("books.xml")
Dim navigator As XPathNavigator = document.CreateNavigator()
' Returns a number.
Dim query1 As XPathExpression = navigator.Compile("bookstore/book/price/text()*10")
Console.WriteLine(query1.ReturnType)
Dim number As Double = CType(navigator.Evaluate(query1), Double)
Console.WriteLine(number)
' Returns a node set.
Dim query2 As XPathExpression = navigator.Compile("bookstore/book/price")
Console.WriteLine(query2.ReturnType)
Dim nodes As XPathNodeIterator = navigator.Select(query2)
nodes.MoveNext()
Console.WriteLine(nodes.Current.Value)
XPathDocument document = new XPathDocument("books.xml");
XPathNavigator navigator = document.CreateNavigator();
// Returns a number.
XPathExpression query1 = navigator.Compile("bookstore/book/price/text()*10");
Console.WriteLine(query1.ReturnType);
Double number = (Double)navigator.Evaluate(query1);
Console.WriteLine(number);
// Returns a node set.
XPathExpression query2 = navigator.Compile("bookstore/book/price");
Console.WriteLine(query2.ReturnType);
XPathNodeIterator nodes = navigator.Select(query2);
nodes.MoveNext();
Console.WriteLine(nodes.Current.Value);
この例は、books.xml ファイルを入力として使用します。
<?xml version="1.0" encoding="utf-8" ?>
<bookstore>
<book genre="autobiography" publicationdate="1981-03-22" ISBN="1-861003-11-0">
<title>The Autobiography of Benjamin Franklin</title>
<author>
<first-name>Benjamin</first-name>
<last-name>Franklin</last-name>
</author>
<price>8.99</price>
</book>
<book genre="novel" publicationdate="1967-11-17" ISBN="0-201-63361-2">
<title>The Confidence Man</title>
<author>
<first-name>Herman</first-name>
<last-name>Melville</last-name>
</author>
<price>11.99</price>
</book>
<book genre="philosophy" publicationdate="1991-02-15" ISBN="1-861001-57-6">
<title>The Gorgias</title>
<author>
<name>Plato</name>
</author>
<price>9.99</price>
</book>
</bookstore>
XPath 式のパフォーマンスの向上
パフォーマンスを向上させるには、クエリで可能な限り特定した XPath 式を使用します。 たとえば、book が bookstore ノードの子ノードであり bookstore ノードが XML ドキュメントで最上位のノードの場合は、XPath 式 /bookstore/book を使用すると //book を使用した場合より高速です。 //book XPath 式は、XML ツリーのすべてのノードをスキャンしてノードとの一致を調べます。
さらに、選択基準が単純な場合は XPathNavigator クラスが提供するノード セット ナビゲーション メソッドは、XPathNavigator クラスが提供する選択メソッドに比べてパフォーマンスが高いことがあります。 たとえば、現在のノードの最初の子を選択する場合、MoveToFirst メソッドを使用した方が child::*[1] XPath 式と Select メソッドを使用するよりも高速です。
XPathNavigator クラスのノード セット ナビゲーション メソッドの詳細については「XPathNavigator を使用するノード セットのナビゲーション」を参照してください。