パッケージ javax.xml.xpath
XPath APIは、XML Path Language (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では、選択したノードを次のいずれかのデータ型に連結できます。
BooleanNumberString
3.1 QName型
XPath APIは、XPath評価の戻り型を表すために、次のQName型を定義します。
XPathConstants.NODESETXPathConstants.NODEXPathConstants.STRINGXPathConstants.BOOLEANXPathConstants.NUMBER
戻り型は、式の評価に使用されるメソッド・コールのQNameパラメータで指定されます。これは、XPathExpression.evalute(...)またはXPath.evaluate(...)メソッドの呼出しです。
Boolean型戻り値が要求されると、1つまたは複数のノードが選択されている場合はBoolean.TRUEが返され、そうでない場合はBoolean.FALSEが返されます。
String戻り値型は、テキスト・ノード、属性ノード、コメント・ノード、または処理の指示ノードから文字データを取得する場合に便利です。 要素ノードに使うと、子テキスト・ノードの値が返されます。
Number戻り値型は、ノードのテキストをdoubleデータ型に合体させます。
3.2 クラスの型
XPath APIでは、QName型に加えて、XPathExpression.evaluteExpression(...)またはXPath.evaluateExpression(...)メソッドによるクラス型の使用もサポートされます。 XPathデータ型は、次のようにクラス型にマップされます。
Boolean--Boolean.classNumber--Number.classString--String.classNodeset--XPathNodes.classNode--Node.class
Numberのサブタイプでは、Double、IntegerおよびLongのみがサポートされています。
3.3 列挙型
列挙型は、前述のQName型とクラス型との間のマッピングを提供するXPathEvaluationResult.XPathResultTypeで定義されます。 XPathExpression.evaluteExpression(...)またはXPath.evaluateExpression(...)メソッドを使用して式を評価した結果は、これらのタイプのいずれかになります。
4.XPathコンテキスト
XPathロケーション・パスは、contextと呼ばれるドキュメントの中の特定のノードに関連する場合があります。 コンテキストは次のもので構成されます。
- ノード(コンテキスト・ノード)
- ゼロ以外の正の整数のペア(コンテキスト位置およびコンテキスト・サイズ)
- 一連の変数バインディング
- 関数ライブラリ
- 式のスコープ内のネームスペース宣言のセット
ノードの階層として表される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);
前述の例では、XPath APIに渡される前に、XMLファイルが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仕様では、整数型を返す関数も提供されます。 このような操作を容易にするために、XPath APIでは、IntegerおよびLongを次のコードのようなevaluateExpressionメソッドで使用できます。
int count = xpath.evaluate("count(/widgets/widget)", document, Integer.class);
- 導入されたバージョン:
- 1.5
-
インタフェースのサマリー インタフェース 説明 XPath XPathはXPath評価環境および式へのアクセスを提供します。XPathEvaluationResult<T> XPathEvaluationResultインタフェースは、特定のノードのコンテキスト内のXPath式の評価結果を表します。XPathExpression XPathExpressionはコンパイルされたXPath式へのアクセスを提供します。XPathFunction XPathFunctionはXPath関数へのアクセスを提供します。XPathFunctionResolver XPathFunctionResolverは一連のユーザー定義のXPathFunctionへのアクセスを提供します。XPathNodes XPathNodesは、XML Path Language (XPath) Version 1.0、 3.3 Node-setsで指定されたロケーション・パスによって選択されたノードのセットを表します。XPathVariableResolver XPathVariableResolverは一連のユーザー定義のXPath変数へのアクセスを提供します。 -
クラスのサマリー クラス 説明 XPathConstants XPath定数です。XPathFactory XPathFactoryインスタンスを使用して、XPathオブジェクトを作成できます。 -
列挙型のサマリー 列挙型 説明 XPathEvaluationResult.XPathResultType XPathResultTypeは、XPath評価の可能な戻り型を表します。 -
例外のサマリー 例外 説明 XPathException XPathExceptionはジェネリックXPath例外を表します。XPathExpressionException XPathExpressionExceptionはXPath式のエラーを表します。XPathFactoryConfigurationException XPathFactoryConfigurationExceptionはXPathFactory環境の構成エラーを表します。XPathFunctionException XPathFunctionExceptionはXPath関数のエラーを表します。