XML Path Language (XPath) について
XPath(XML Path Language)は、XML文書内の特定の要素や属性を指定するためのクエリ言語です。W3Cによって標準化され、XSLT(XSL Transformations)などXML処理技術の一部として利用されています。XPathは、XML文書をノードの木構造として捉え、その構造に基づいて要素や属性を選択する式を記述します。
XPathの主な特徴は以下の通りです。
簡潔な構文: XPathは、直感的で簡潔な構文を持ち、XML文書の特定部分を容易に指定できます。
ノードの木構造: XML文書をルートノードを頂点とする木構造として扱い、各ノード(要素、属性、テキストなど)を操作します。
ロケーションパス: XPathの主要な要素はロケーションパスであり、ノードの階層構造を指定することで、特定のノードを選択します。
軸、ノードテスト、述語: ロケーションパスは、軸(ノード間の関係)、ノードテスト(ノードの種類や名前)、述語(条件)から構成され、より細かくノードを選択できます。
XPathの歴史
XPath 1.0: 1999年11月16日にXSLT 1.0と同時にW3C勧告として発表されました。
XPath 2.0: 2007年1月23日にXSLT 2.0と同時に勧告され、XPath 1.0から大幅に拡張され、
データ型や関数のサポートが強化されました。
XPath 3.0: 2014年4月8日に勧告されました。
XPath 3.1: 2017年3月21日に勧告されました。
XPathのデータモデル
XPathは、XML文書を以下の7種類のノードから構成される木構造として扱います。
1. ルートノード: XML文書全体のルートとなるノード
2. 要素ノード: XML要素を表すノード
3. テキストノード: 要素内のテキストを表すノード
4. 属性ノード: 要素の属性を表すノード
5. 名前空間ノード: 要素の名前空間を定義するノード
6. 処理命令ノード: XML処理命令を表すノード
7. コメントノード: XMLコメントを表すノード
ロケーションパス
ロケーションパスは、XML文書内のノードを指定するための基本となる式です。ロケーションパスは、一つまたは複数のロケーションステップから構成されます。
ロケーションステップは、次の3つの要素から構成されます。
1.
軸(axis): ノード間の関係を指定(例: child, descendant, parent)
2.
ノードテスト(node test): 選択するノードの種類や名前を指定(例: 要素名, text(), comment())
3.
述語(predicate): ノードを選択するための条件を指定(例: `[@attribute='value']`)
省略構文と完全な構文
XPathには、ロケーションパスを記述するための2つの構文があります。
省略構文: よく使われる既定値を使い、簡潔にXPath式を記述できます。例:`/A/B/C`
完全な構文: より詳細に、軸、ノードテスト、述語を明示的に記述します。例:`/child::A/child::B/child::C`
省略構文の例
`/A/B/C`: 絶対パス。ルート要素Aの子要素Bの子要素Cを選択
`//paragraph`: 文書内の全てのparagraph要素を選択
`A//B/[1]`: 相対パス。A要素の子孫要素であるB要素の子要素の最初の要素を選択
完全な構文の例
`/child::A/child::B/child::C`: 省略構文の`/A/B/C`に対応
`child::A/descendant-or-self::node()/child::B/child::
[1]`: 省略構文の`A//B/[1]`に対応
軸(axis)
軸は、XML文書の木構造におけるノード間の関係を指定します。XPathで定義されている13種類の軸は以下の通りです。
`child`: コンテクストノードの子ノード
`descendant`: コンテクストノードの子孫ノード
`parent`: コンテクストノードの親ノード
`ancestor`: コンテクストノードの祖先ノード
`following-sibling`: コンテクストノードの後ろの兄弟ノード
`preceding-sibling`: コンテクストノードの前の兄弟ノード
`following`: コンテクストノードより文書順で後方のノード
`preceding`: コンテクストノードより文書順で前方のノード
`attribute`: コンテクストノードの属性ノード
`namespace`: コンテクストノードの名前空間ノード
`self`: コンテクストノード自身
`descendant-or-self`: コンテクストノード自身と子孫ノード
`ancestor-or-self`: コンテクストノード自身と祖先ノード
ノードテスト
ノードテストは、選択するノードの種類や名前を指定します。
`名前`: 要素ノードの名前や属性ノードの名前を指定
`text()`: 全てのテキストノードを指定
`comment()`: 全てのコメントノードを指定
`processing-instruction()`: 全ての処理命令ノードを指定
`node()`: 全てのノードを指定
``: 主ノード型の全てのノードを指定
`名前空間接頭辞:`: 指定した名前空間に属する全てのノードを指定
述語(predicate)
述語は、ノードを選択するための条件を指定します。述語は角括弧`[]`で囲んで記述します。
例:
`//a[@href='help.php']`: `href`属性が`'help.php'`である全ての`a`要素を選択
`//a[@href='help.php'][name(..)='div'][../@class='header']/@target`: `a`要素の`href`属性が`'help.php'`であり、親要素が`div`要素で`class`属性が`'header'`である`a`要素の`target`属性を選択
XPath 1.0では、以下の4種類の
データ型が定義されています。
1. ノード集合 (node-set)
2. 文字列 (string)
3. 数値 (number)
4. 論理型 (boolean)
XPathでは、様々な演算子と関数が利用可能です。
演算子: 比較演算子、算術演算子、論理演算子など
関数: 文字列関数、数値関数、ノード関数、型変換関数など
例:
`//item[@price >= 2@discount]`: `price`属性が`discount`属性の2倍以上の`item`要素を選択
`v[x or y] | w[z]`: `x`または`y`を子要素にもつ`v`要素と、`z`を子要素にもつ`w`要素の和集合
よく使われる関数
`position()`: コンテクストノードの位置を数値で返す。
`count(node-set)`: ノード集合のノード数を返す。
`id(object)`: ID型の属性値を持つノードの集合を返す。
`name(node-set?)`: ノード集合の最初のノードの名前を返す。
`string(object?)`: オブジェクトを文字列に変換する。
`string-length(string?)`: 文字列の長さを返す。
`substring(string,number,number?)`: 文字列の部分文字列を返す。
`concat(string,string,string)`: 文字列を連結する。
`contains(string1,string2)`: 文字列`string1`に`string2`が含まれているかを判定する。
`normalize-space(string?)`: 文字列の前後の空白を取り除き、連続する空白を一つにする。
`not(boolean)`: 論理値を反転する。
`sum(node-set)`: ノード集合の文字列値を数値に変換して合計する。
XPath 2.0
XPath 2.0では、XML Schemaで定義された様々な
データ型を扱えるようになりました。また、全ての値をシーケンスとして扱うようになり、関数と演算子が拡張されました。
XPath 3.0, 3.1
XPath 3.0および3.1では、XPath 2.0をさらに拡張し、新しい関数や機能が追加されました。
XPathは、様々なプログラミング言語で
実装されています。
Java: `javax.xml.xpath`パッケージでXPath 1.0が利用可能
JavaScript: ブラウザのDOM APIでXPathを評価可能。
XMLHttpRequestで取得したXMLに対しても利用可能
*
XSLT処理系: XSLT処理系は、XPathを使ってXML文書のノードを指定
まとめ
XPathはXML文書の構造を操作するための強力なツールであり、XML処理を行う様々な技術で利用されています。その構文と機能を理解することで、XML文書から必要な情報を効率的に抽出することができます。