1. ホーム
  2. Web プログラミング
  3. XML/RSS
  4. XMLの例

xpath入門_Power Node Java Academy

2022-01-17 09:29:33

簡単に言うと、xpathはXMLファイルのノードを選択する方法です。

ノードとは、XMLファイルを構成する最小の単位であり、7種類のノードが存在する。

- element(要素ノード)
- 属性 (属性ノード)
- text (textノード)
- namespace (namespace ノード)
- processing-instruction (処理命令ノード)
- comment (コメントノード)
- root (ルート・ノード)

xpathはこれら7種類のノードを選択することができる。ただし、以下の注釈では、最初によく使われる要素ノードのみを取り上げているので、ノードと要素は以下では同義語とみなしてよい。

I. xpath 式の基本フォーマット

xpathは"Path Expressions"によってノードを選択します。形式的には、quot;Path Expressions" は従来のファイルシステムに非常によく似ています。

# スラッシュ(/)はパス内部でスプリッターとして機能します。
# 同じノードを絶対パスと相対パスの両方で記述します。
# 絶対パスは "/"で始まり、その後にルートノードが続く必要があります。
# 相対パスはstep/stepのように絶対パスとは別の書き方、つまり"/"で始まらない書き方をします。
# ". "は現在のノードを示します。
# ". "は現在のノードの親を示します。

II. ノードの選択に関する基本ルール

- nodename (ノード名): ノードのすべての子ノードが選択されることを示します。
- "/":ルートノードが選択されることを示す。
- "//":任意の位置のノードを選択することを意味します。
- "@":属性の選択を表します。

III. 選択ノードの例

まず、XMLの例文から見てみましょう。

<?xml version="1.0" encoding="ISO-8859-1"? >
<bookstore>
 <book>
  <title lang="eng">Harry Potter</title>
  <price>29.99</price>
 </book>
 <book>
  <title lang="eng">Learning XML</title>
  <price>39.95</price>
 </book>
</bookstore>

[例1】のように]

bookstore: bookstore 要素のすべての子を選択します。

[例2】のように]

/bookstore : ルートノードbookstoreを選び、絶対パスで記述します。

[例3】のように]

bookstore/book: 相対パスで記述されたbookstoreの子であるbook要素をすべて選択します。

[例4】のように]

//book : ドキュメント内の位置に関係なく、すべての book 子要素を選択します。

[例5】のように]

bookstore//book: bookstore要素の子孫であるすべてのbook要素を、bookstoreの下のどこに位置するかに関係なく選択します。

[例6】のように]

//@lang : langという名前の属性をすべて選択します。

IV. xpathの述語条件(Predicate)

述語条件"述語条件"は、パス表現に付けられる条件です。

角括弧 "[]" で書かれたすべての条件は、ノードのさらなるフィルタリングを示します。

[例7】のように]

/bookstore/book[1] : bookstoreの最初のbookの子要素が選択されていることを示す。

[例8】のように]

/bookstore/book[last()] : bookstoreの最後の本の子要素が選択されていることを示す。

[例9】のように]

/bookstore/book[last()-1] : bookstoreのpenultimate book子要素が選択されたことを示す。

[例10】のように]

/bookstore/book[position()<3] : bookstoreの最初の2つのbookの子要素が選択されることを示す。

[例11】のように]

//title[@lang] : lang属性を持つ全てのtitleノードが選択されることを示す.

[例12】のように]

//title[@lang='eng'] : lang属性の値が "eng" であるすべてのタイトルノードが選択されることを示す。

[例13】のように]

/bookstore/book[price] : bookstoreのbook子要素が選択されていることを示し、選択されたbook要素にはprice子要素が必要です。

[例14】のように]

/bookstore/book[price>35.00]: bookstoreのbookサブ要素が選択され、選択されたbook要素のpriceサブ要素が35より大きい値でなければならないことを示しています。

[例15】のように]

/bookstore/book[price>35.00]/title : 例14の結果セットでtitle子要素が選択されたことを示す。

[例16】のように]

/bookstore/book/price[. >35.00] : "/bookstore/book"のprice子要素で値が35より大きいものが選択されていることを示します。

V. ワイルドカード

# は任意の要素ノードにマッチすることを意味します。
# "@*"は任意の属性値にマッチします。
# node() はあらゆるタイプのノードにマッチします。

[例17】のように]

//* : ドキュメント内のすべての要素ノードを選択します。

[例18】のように]

/*/* : 第2階層の要素ノードが全て選択されていることを示す。

[例19】のように]

/bookstore/* : bookstoreのすべての要素の子ノードが選択されることを示す。

[例20】のように]

//title[@*] : 属性を持つ全ての title 要素が選択されていることを示す。

VI. 複数パスの選択

複数の同時パスを"|"で選択します。

[例21】のように]

//book/title | //book/price : book 要素の title サブ要素および price サブ要素の両方が選択されていることを示します。