XPath (XML Path Language)とは、XMLドキュメントから特定のノードを選択するための問合せ言語である。

XMLデータはツリーとしてモデル化でき、また、要素や属性などXMLデータを構成する各パーツは、ツリーを構成するノードとしてモデル化できます。XPathのデータモデルでは、XMLデータを以下の7種類のノードから構成されるツリーと考えます。

スポンサーリンク

文法

次にXPathの書式を示します

軸::ノード[式]

キーワード 対象
ancestor 祖先
ancestor-or-self カレントノードと祖先
attribute 属性
child
descendant 子孫
descendant-or-self カレントノードと子孫
following カレントノードより後に出現するノード
following-sibling 兄弟(カレントノードより後ろ)
namespace 名前空間
parent
preceding-sibling 兄弟(カレントノードより前)
preceding カレントノードより前に出現するノード
self カレントノード

軸には簡略化した記述方法があります。次に軸を簡略化した文法の一覧を示します。

XPathの軸
簡略化した文法 正式な文法 意味
記述省略 child
@ attribute 属性
. self::node() カレントノード
.. parent::node()
/ /descendant-or-self::node()/ すべてのノード

軸を簡略化して記述する場合は、軸とノードの区切り記号である「::」は省略します。

たとえば、カレントノードの子要素 book の子要素 title は次のように表記できます。

child::book/child::title

また、簡略書式では次のように表記できます。

book/title

例: カレントノードの子要素 book の属性 isbn

child::book/attribute::isbn
book/@isbn

ノード

XML 文章内で特定のノードの位置を指定するための式をロケーションパスと呼びます。ロケーションパスには、厳密かつ詳細に記述する書き方と、簡略に記述する書き方(省略シンタックス)の2種類があります。

省略シンタックスの主な構文(ロケーションステップ)を以下の表に示します。

XPathのノード
構文 意味
/ ルートノードを選択します
. コンテキストノード(現在位置のノード)を選択します。
.. コンテキストノードの親を選択します。
name 子要素nameまたは属性name(子要素と属性の区別は軸で指定)
* 指定したパスの直下の全ての子要素または属性(子要素と属性の区別は軸で指定)
text() 指定したパスの直下のテキストを選択します。指定形式:パス/text()
node() 指定したパスの直下のノードを選択します(属性ノードは含みません)。指定形式:パス/node()
//element ルートノードの子孫ノードから要素ノード element を全て選択します。つまり、同じ名前をもつノードすべてを指定する場合に使用します。

ロケーションステップを1個以上"/"で繋いだものがロケーションパスです。階層構造は、ノード名とノード名を"/"で区切って記述します。

ロケーションパスには、現在位置のノードを起点として指定する「相対ロケーションパス」と、ルートノードを起点として指定する「絶対ロケーションパス」の2種類があります。

軸::ノード で指定した条件をさらに細かく指定するために使用します。

ノードを限定するには node_name[2] のように番号を指定するか、 node_name[@attrib_name="value"] のように条件を指定します。条件指定はand ,orなどで複合できます。

コンテキストノードの1番目の子要素bookを選択する。

book[1]

条件式に関数を使うこともできます。次の例では、コンテキストノードの最後の子要素bookを選択します。

book[last()]

式には以下に示す演算子を使用することができます。

演算子
演算子 説明
= 等しい
eq 等しい
!= 等しくない
ne 等しくない
< 左の値が右の値より小さい
lt 左の値が右の値より小さい
> 左の値が右の値より大きい
gt 左の値が右の値より大きい
<= 左の値が右の値以下
le 左の値が右の値以下
>= 左の値が右の値以上
ge 左の値が右の値以上
+ 加算
- 減算
* 乗算
div 除算
idiv
mod 剰余
and 論理積
or 論理和
not 否定
is ノードが一致する
isnot ノードが一致しない
<< ノードの出現が早い
>> ノードの出現が遅い

コンテキストノードの子要素bookのうち、子要素authorを1個以上持つものを選択する。

book[author]

例: コンテキストノードの子要素bookのうち、文字列値が "Michael Moorcock" である子要素authorを1個以上持つものを選択

child::book[attribute::author="Michael Moorcock"]
book[author="Michael Moorcock"]

例: author属性とprice属性の両方をもつコンテキストノードの子要素bookを全て選択

child::book[attribute::author and attribute::price]
book[@author and @price]

例: カレントノードの子 book の属性 isbn が 4-274-06453-0 と等しい

child::book[attribute::isbn='4-274-06453-0']
book[@isbn='4-274-06453-0']

and演算子により「複数の条件をすべて満たす」という条件を設定できます。 例えば、「 /library/book/author/text() が“夏目漱石”で、なおかつ /library/book/publisher/text() が“岩波書店”である」ノードを表すXPath表現式は次のようになります。

/library/book[author/text()="夏目漱石" and publisher/text()="岩波書店"]

or演算子により「複数の条件のどれかを満たす」という条件を設定できます。 例えば、「 /library/book/author/text() が“芥川龍之介”か、または“夏目漱石”である」ノードを表すXPath表現式は次のようになります。

/library/book[author/text()="芥川龍之介" or author/text()="夏目漱石"]
このエントリーをはてなブックマークに追加
スポンサーリンク