コンパイルされた XPath 式

XPathExpression オブジェクトは、Compile クラスの静的 XPathExpression メソッドまたは Compile クラスの XPathNavigator メソッドから返されるコンパイル済み XPath クエリを表します。

XPathExpression クラス

XPathExpression オブジェクトにより表されるコンパイル済み XPath クエリは、同じ XPath クエリが複数回使用されるときに有用です。

たとえば、Select メソッドを複数回呼び出すとき、毎回 XPath クエリを表す文字列を使用する代わりに、再使用とパフォーマンスの向上のために、Compile クラスの XPathExpression メソッド、または Compile クラスの XPathNavigator メソッドを使用して、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 の戻り型の 1 つではなく、1 つの XPathNavigator オブジェクトを返します。

戻り型のプロパティ

XPath クエリが XPathExpression オブジェクトにコンパイルされた後、ReturnType オブジェクトの XPathExpression プロパティを使用して、XPath クエリで何が返されるかを知ることができます。

ReturnType プロパティは、W3C XPath 戻り値を表す、次の XPathResultType 列挙値の 1 つを返します。

次の例は、XPathExpression オブジェクトを使用して、books.xml ファイルから 1 つの数値とノード セットを返します。 各 ReturnType オブジェクトの XPathExpression プロパティと共に、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 式を使用します。 たとえば、bookbookstore ノードの子ノードであり bookstore ノードが XML ドキュメントで最上位のノードの場合は、XPath 式 /bookstore/book を使用すると //book を使用した場合より高速です。 //book XPath 式は、XML ツリーのすべてのノードをスキャンしてノードとの一致を調べます。

さらに、選択基準が単純な場合は XPathNavigator クラスが提供するノード セット ナビゲーション メソッドは、XPathNavigator クラスが提供する選択メソッドに比べてパフォーマンスが高いことがあります。 たとえば、現在のノードの最初の子を選択する場合、MoveToFirst メソッドを使用した方が child::*[1] XPath 式と Select メソッドを使用するよりも高速です。

XPathNavigator クラスのノード セット ナビゲーション メソッドの詳細については「XPathNavigator を使用するノード セットのナビゲーション」を参照してください。

関連項目