XPath基礎編 - 2.基本文法
一週間前以上前にアップデートされました

XPathの文法の基礎を学ぶことは、XPathを使ってXMLドキュメントからデータを選択することができるようになる重要なステップです。

  • XMLとXPathの関係 XPathは、XML文書の特定のノード(要素、属性、テキストなど)を選択するための文法です。XMLとは、ツリー構造を持つデータ形式であり、要素、属性、テキストなどのノードで構成されています。XPathは、XMLのツリー構造の中で、目的のノードを選択するための方法を提供します。

  • XPath式の構成 XPath式は、ノードの位置、関係、属性、値などから構成されます。XPath式には、パス表現、述語、演算子、関数などがあります。これらを組み合わせることで、XMLドキュメントの中から目的のデータを選択することができます。

  • XPathのノードの種類と軸 XPathには、要素、属性、テキスト、コメント、処理命令などのさまざまなノードがあります。XPathには、ノードを相対的または絶対的に指定する方法があります。また、XPathは、現在のノード、親ノード、子ノードなど、異なる軸を使用してノードを指定することができます。

例えば、以下のXMLドキュメントを考えてみましょう。

<books>
  <book id="1001">
    <title>Harry Potter and the Philosopher's Stone</title>
    <author>J.K. Rowling</author>
    <year>1997</year>
  </book>
  <book id="1002">
    <title>Harry Potter and the Chamber of Secrets</title>
    <author>J.K. Rowling</author>
    <year>1998</year>
  </book>
</books>

このドキュメントから、XPathを使って次のようなデータを選択することができます。

  • すべての書籍のタイトル:/books/book/title

  • 1001番の書籍のタイトル:/books/book[@id='1001']/title

  • J.K. Rowlingが著者のすべての書籍のタイトル:/books/book[author='J.K. Rowling']/title

  • 1997年より前に発行された書籍のタイトル:/books/book[year<'1997']/title

軸 preceding-sibling::とfollowing-sibling::

preceding-sibling::およびfollowing-sibling::はXPathの軸の一種で、指定されたノードの前および後ろにある兄弟ノードを選択するために使用されます。両方の軸は、親ノードから指定されたノードまでの兄弟ノードを返します。

例えば、以下のHTMLがあるとします。

<div>
  <p>これは1番目の段落です。</p>
  <p>これは2番目の段落です。</p>
  <p>これは3番目の段落です。</p>
  <p>これは4番目の段落です。</p>
  <p>これは5番目の段落です。</p>
</div>

このHTMLで、preceding-sibling::軸を使用して、要素「3番目の段落」の直前にある要素「2番目の段落」を選択するには、次のXPathを使用します。

//p[text()="これは3番目の段落です。"]/preceding-sibling::p[1]

このXPathは、要素「3番目の段落」を「//p[text()="これは3番目の段落です。"]」で選択し、その前にある要素「2番目の段落」を「preceding-sibling::p[1]」で選択しています。

同様に、following-sibling::軸を使用して、要素「3番目の段落」の直後にある要素「4番目の段落」を選択するには、次のXPathを使用します。

//p[text()="これは3番目の段落です。"]/following-sibling::p[1]

このXPathは、要素「3番目の段落」を「//p[text()="これは3番目の段落です。"]」で選択し、その後にある要素「4番目の段落」を「following-sibling::p[1]」で選択しています。

このように、preceding-sibling::およびfollowing-sibling::軸を使用することで、指定されたノードの前および後ろにある兄弟ノードを選択することができます。

続きを読む

こちらの回答で解決しましたか?