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 |
XPathNodeIterator | ドキュメントの順序で作成された重複のないノードの順序なしコレクション。 | Select または Evaluate |
Boolean |
Boolean |
true または false の値。 |
Evaluate または Matches |
Number |
Double | 浮動小数点数。 | Evaluate |
String |
String | UCS 文字のシーケンス。 | Evaluate |
注
Matches メソッドは、パラメーターとして XPath 式を受け入れます。 SelectSingleNode メソッドは、W3C XPath の戻り値の型ではなく、XPathNavigator オブジェクトを返します。
ReturnType プロパティ
XPath クエリを XPathExpression オブジェクトにコンパイルした後、XPathExpression オブジェクトの ReturnType プロパティを使用して、XPath クエリが返す内容を確認できます。
ReturnType プロパティは、W3C XPath 戻り値の型を表す次のXPathResultType列挙値のいずれかを返します。
次の例では、 XPathExpression オブジェクトを使用して、 books.xml
ファイルから数値とノード セットを返します。 各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 クラスによって提供される選択メソッドに対するパフォーマンスが向上する可能性があります。 たとえば、現在のノードの最初の子を選択する必要がある場合は、child::*[1]
XPath 式と Select メソッドを使用するよりも、MoveToFirst メソッドを使用する方が高速です。
XPathNavigator クラスのノード セット ナビゲーション メソッドの詳細については、「XPathNavigator を使用したノード セット ナビゲーション」を参照してください。
こちらも参照ください
.NET