モジュール java.xml

パッケージ javax.xml.xpath

XPath式の評価と評価環境へのアクセス用の「オブジェクトモデル・ニュートラル」 APIを提供します。

XPath APIは「XMLパス言語(XPath)バージョン1.0」をサポートしています


1. XPathの概要

XPath言語は、XMLドキュメントからノードを選択するための単純で簡潔な構文を提供します。 また、XMLドキュメント・オブジェクト・モデル(DOM)ツリーのノードをboolean、doubleまたはstring値に変換するための規則も提供します。 XPathはW3Cによって定義された言語であり、公式のW3C勧告です。W3CはXML Path Language (XPath) Version 1.0仕様をホストしています。

XPathは1999年にXSLTおよびXPointer言語の補足として誕生しましたが、最近では独立した言語として、また多くのDOM APIコードの代わりに使用できる単一のXPath式として普及してきました。

2. XPath式

XPath は、1つのロケーション・パス、および1つまたは複数のオプションのプレディケートで構成されます。 式にはXPath変数が含まれる場合もあります。

簡単なXPath式の例を次に示します。

     /foo/bar
 

この例は、次のようなXMLドキュメントの<bar>要素を選択します。

     <foo>
         <bar/>
     </foo>
 

/foo/barは、ロケーション・パスの例です。 XPathのロケーション・パスはUnixスタイルのファイル・システム・パスに似ていますが、XPath式では式にマッチするすべてのノードを返すという点が重要な相違です。 したがって、/foo/bar式によって次のドキュメントの3つすべての<bar>要素が選択されます。

     <foo>
         <bar/>
         <bar/>
         <bar/>
     </foo>
 

特別なロケーション・パス演算子、//は、深さに関係なくXMLドキュメントのノードを選択します。 ドキュメント内の位置にかかわらず、すべての<bar>要素を選択する場合の例を次に示します。

     //bar
 

ワイルドカード演算子*を使用すると、すべての要素ノードが選択されます。 <foo>要素のすべての子要素を選択する例を次に示します。

     /foo/*
 

XPathロケーション・パスは、要素ノードだけでなく、属性ノード、テキスト・ノード、コメント・ノード、および処理の指示ノードをアドレス指定することもできます。 これらの各ノード型に対するロケーション・パスの例を次の表に示します。

ロケーション・パスの例
ロケーション・パス 説明
/foo/bar/@id <bar>要素の属性idを選択
/foo/bar/text() <bar>要素のテキスト・ノードを選択。 エスケープされた文字データと、エスケープされていない文字データに違いはない。
/foo/bar/comment() <bar>要素に含まれるすべてのコメント・ノードを選択。
/foo/bar/processing-instruction() <bar>要素に含まれるすべての処理の指示ノードを選択。

プレディケートでは、XPathのロケーション・パスで選択されたノードを洗練することが可能です。 プレディケートは、[expression]の形式をとります。 trueの値を持つinclude属性を含むすべての<foo>要素を選択する例を次に示します。

     //foo[@include='true']
 

プレディケートを次のように追加して、式をさらに洗練することもできます。

     //foo[@include='true'][@mode='bar']
 

3. XPathデータ型

XPath式はXML文書内のノードを選択しますが、XPath APIを使用すると、選択したノードを次のいずれかのデータ型にまとめることができます:

  • Boolean
  • Number
  • String

3.1 QName型

XPath APIは、XPath評価の戻り値の型を表す次のQName型を定義します:

戻り値の型は、XPathExpression.evalute(...)メソッドまたはXPath.evaluate(...)メソッドのいずれかの式を評価するために使用されるメソッド呼び出しのQNameパラメータによって指定されます。

Boolean型戻り値が要求されると、1つまたは複数のノードが選択されている場合はBoolean.TRUEが返され、そうでない場合はBoolean.FALSEが返されます。

String戻り値型は、テキスト・ノード、属性ノード、コメント・ノード、または処理の指示ノードから文字データを取得する場合に便利です。 要素ノードに使うと、子テキスト・ノードの値が返されます。

Number戻り値型は、ノードのテキストをdoubleデータ型に合体させます。

3.2 クラスの型

QName型に加えて、XPath APIは、XPathExpression.evaluteExpression(...)またはXPath.evaluateExpression(...)メソッドによるクラス型の使用をサポートしています。 XPathデータ型は、次のようにクラス型にマップされます:
  • Boolean -- Boolean.class
  • Number -- Number.class
  • String -- String.class
  • Nodeset -- XPathNodes.class
  • Node -- Node.class

Numberのサブ型のうち、Double、Integer、およびLongだけがサポートされています。

3.3 列挙型

Enum型は、上記のQNameとClass型の間のマッピングを提供するXPathEvaluationResult.XPathResultTypeで定義されています。 XPathExpression.evaluteExpression(...)またはXPath.evaluateExpression(...)メソッドを使用して式を評価した結果は、これらの型のいずれかになります。

4. XPathコンテキスト

XPathロケーション・パスは、contextと呼ばれるドキュメントの中の特定のノードに関連する場合があります。 コンテキストは:

  • ノード(コンテキスト・ノード)
  • 0以外の正の整数のペア(コンテキスト位置とコンテキスト・サイズ)
  • 可変バインディングのセット
  • 関数ライブラリ
  • 式のスコープ内にあるネームスペース宣言のセット

これは、ノードの階層として表現されるXML文書ツリーであり、JDK実装ではたとえばNodeです。

5. XPath APIの使用

次のXMLドキュメントを考えます。
 <widgets>
 <widget>
 <manufacturer/>
 <dimensions/>
 </widget>
 </widgets>
 

<widget>要素は、次のプロセスで選択できます:

     // parse the XML as a W3C Document
     DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
     Document document = builder.parse(new File("/widgets.xml"));

     //Get an XPath object and evaluate the expression
     XPath xpath = XPathFactory.newInstance().newXPath();
     String expression = "/widgets/widget";
     Node widgetNode = (Node) xpath.evaluate(expression, document, XPathConstants.NODE);

     //or using the evaluateExpression method
     Node widgetNode = xpath.evaluateExpression(expression, document, Node.class);
 

<widget>要素を参照すると、相対XPath式を記述して<manufacturer>子要素を選択できます:

     XPath xpath = XPathFactory.newInstance().newXPath();
     String expression = "manufacturer";
     Node manufacturerNode = (Node) xpath.evaluate(expression, widgetNode, XPathConstants.NODE);

     //or using the evaluateExpression method
     Node manufacturerNode = xpath.evaluateExpression(expression, widgetNode, Node.class);
 

上記の例では、XMLファイルはXPath APIに渡される前にDOMドキュメントに読み込まれます。 次のコードは、InputSourceを使用してXPath実装を処理して処理する方法を示しています:

     XPath xpath = XPathFactory.newInstance().newXPath();
     String expression = "/widgets/widget";
     InputSource inputSource = new InputSource("widgets.xml");
     NodeList nodes = (NodeList) xpath.evaluate(expression, inputSource, XPathConstants.NODESET);

     //or using the evaluateExpression method
     XPathNodes nodes = xpath.evaluate(expression, inputSource, XPathNodes.class);
 

上記の場合、期待される結果の型は既知です。 結果の型が不明である場合、または任意の型の場合は、XPathEvaluationResultを使用して戻り値の型を決定できます。 次のコードは、使用方法を示しています:

     XPathEvaluationResult<?> result = xpath.evaluateExpression(expression, document);
     switch (result.type()) {
         case NODESET:
             XPathNodes nodes = (XPathNodes)result.value();
             ...
             break;
     }
 

XPath 1.0のNumberデータ型はdouble型として定義されています。 ただし、XPath仕様ではInteger型を返す関数も用意されています。 このような操作を容易にするために、XPath APIを使用すると、IntegerおよびLongをevaluateExpressionメソッド(次のコードなど)で使用できます:

     int count = xpath.evaluate("count(/widgets/widget)", document, Integer.class);
 

導入されたバージョン:
1.5