パッケージjavax.xml.xpath
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
型を定義します:
XPathConstants.NODESET
XPathConstants.NODE
XPathConstants.STRING
XPathConstants.BOOLEAN
XPathConstants.NUMBER
戻り値の型は、XPathExpression.evalute(...)
メソッドまたはXPath.evaluate(...)
メソッドのいずれかの式を評価するために使用されるメソッド呼び出しのQName
パラメータによって指定されます。
Boolean
型戻り値が要求されると、1つまたは複数のノードが選択されている場合はBoolean.TRUE
が返され、そうでない場合はBoolean.FALSE
が返されます。
String
戻り値型は、テキスト・ノード、属性ノード、コメント・ノード、または処理の指示ノードから文字データを取得する場合に便利です。 要素ノードに使うと、子テキスト・ノードの値が返されます。
Number
戻り値型は、ノードのテキストをdouble
データ型に合体させます。
3.2 クラスの型
QNameタイプに加えて、XPath APIでは、XPathExpression.evaluateExpression(...)
または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.evaluateExpression(...)
またはXPath.evaluateExpression(...)
メソッドを使用した式の評価結果は、いずれかのタイプになります。
列挙マッピングとQNameマッピングの違いに注意してください:
NUMBER
NUMBER
の列挙マッピングでは、Double, Integer
およびLong
がサポートされます。
NODESET
NODESET
の列挙マッピングは、QNameマッピングのNodeList
ではなくXPathNodes
です。
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.evaluateExpression(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.evaluateExpression("count(/widgets/widget)", document, Integer.class);
- 導入されたバージョン:
- 1.5
-
クラス説明
XPath
はXPath評価環境および式へのアクセスを提供します。XPath定数です。XPathEvaluationResult
インタフェースは、特定のノードのコンテキスト内でXPath式を評価した結果を表します。XPathResultTypeは、XPath評価の可能な戻り値の型を表します。XPathException
はジェネリックXPath例外を表します。XPathExpression
はコンパイルされたXPath式へのアクセスを提供します。XPathExpressionException
はXPath式のエラーを表します。XPathFactory
インスタンスを使用して、XPath
オブジェクトを作成できます。XPathFactoryConfigurationException
はXPathFactory
環境の構成エラーを表します。XPathFunction
はXPath関数へのアクセスを提供します。XPathFunctionException
はXPath関数のエラーを表します。XPathFunctionResolver
は一連のユーザー定義のXPathFunction
へのアクセスを提供します。XPathNodesは、「XMLパス言語(XPath)バージョン1.0,3.3ノードセット」で指定されたロケーション・パスによって選択されたノードのセットを表します。XPathVariableResolver
は一連のユーザー定義のXPath変数へのアクセスを提供します。