XPath(XML Path Language)は、XML ドキュメントからノードや値を選択するためのクエリ言語です。Apidog では、XPath は XML API レスポンスからデータを抽出したり、XML 構造を検証したり、XML ベースの API 向けのアサーションを作成したりするために使用されます。XPath を使用すると、ドキュメント階層内のパスまたは一連のステップに従って、XML ドキュメント内のノードまたはノードの集合を選択できます。XML の例#
以下の例では、この XML ドキュメントを使用します。<?xml version="1.0" encoding="UTF-8"?>
<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>
ノードの選択#
XPath では、パスまたはステップに従って XML ドキュメント内のノードまたはノードの集合を選択できます。以下は、最も一般的なパス式の一部です。| 式 | 説明 |
|---|
nodename | このノードのすべての子を選択します |
/ | ルートノードから選択します |
// | 現在のノードから、位置に関係なく選択条件に一致するドキュメント内のノードを選択します |
. | 現在のノードを選択します |
.. | 現在のノードの親ノードを選択します |
@ | 属性を選択します |
パス式の例#
次の表は、例の XML に基づくパス式とその結果を示しています。| パス式 | 結果 |
|---|
bookstore | bookstore 要素のすべての子を選択します |
/bookstore | ルート要素 bookstore を選択します。パスがスラッシュ( / )で始まる場合、このパスは常に要素への絶対パスを表します |
bookstore/book | bookstore の子であるすべての book 要素を選択します |
//book | ドキュメント内の位置に関係なく、すべての book 要素を選択します |
bookstore//book | bookstore の下のどこに配置されているかに関係なく、bookstore 要素の子であるすべての book 要素を選択します |
//@lang | lang という名前のすべての属性を選択します |
/ で始まるパスは(ルートからの)絶対パスであり、/ なしのパスは現在のノードを基準とした相対パスです。
述語を使用すると、特定のノードや指定した値を含むノードを検索できます。述語は角括弧で囲まれ、強力なフィルタリングを可能にします。述語の例#
| パス式 | 結果 |
|---|
/bookstore/book[1] | bookstore の子要素のうち最初の book 要素を選択します |
/bookstore/book[last()] | bookstore の子要素のうち最後の book 要素を選択します |
/bookstore/book[last()-1] | bookstore の子要素のうち最後から 2 番目の book 要素を選択します |
/bookstore/book[position()<3] | bookstore の子要素のうち最初の 2 つの book 要素を選択します |
//title[@lang] | lang という名前の属性を持つすべての title 要素を選択します |
//title[@lang='eng'] | 値が eng の lang 属性を持つすべての title 要素を選択します |
/bookstore/book[price>35.00] | price 要素の値が 35.00 より大きい、bookstore のすべての book 要素を選択します |
/bookstore/book[price>35.00]//title | price 要素が 35.00 より大きい、bookstore 内の book 要素のすべての title 要素を選択します |
XPath は、0 ベースのインデックスを使用する JSONPath とは異なり、述語に 1 ベースのインデックスを使用します。最初の要素は [0] ではなく [1] です。
不明なノードの選択#
XPath ワイルドカードを使用すると、正確な名前を知らなくても、不明な XML 要素を選択できます。ワイルドカード構文#
| ワイルドカード | 説明 |
|---|
* | 任意の要素ノードに一致します |
@* | 任意の属性ノードに一致します |
node() | 任意の種類のノードに一致します |
ワイルドカードの例#
| パス式 | 結果 |
|---|
/bookstore/* | bookstore 要素のすべての子要素を選択します |
//* | ドキュメント内のすべての要素を選択します |
//title[@*] | 属性を持つすべての title 要素を選択します |
ワイルドカードは、動的な XML 構造を扱う場合や、名前に関係なくすべての要素を選択したい場合に役立ちます。
複数のパスの選択#
パス式で | 演算子を使用すると、複数のパスを選択でき、複数の選択を組み合わせることができます。複数パスの例#
| パス式 | 結果 |
|---|
//book/title | //book/price | book 要素のすべての title 要素と price 要素を選択します |
//title | //price | ドキュメント内のすべての title 要素と price 要素を選択します |
/bookstore/book/title | //price | bookstore 要素の book 要素のすべての title 要素と、ドキュメント内のすべての price 要素を選択します |
Apidog でのユースケース#
XPath は、Apidog では特に次の用途に役立ちます。XML レスポンス検証: XML API レスポンスから特定の値を抽出して正確性を検証します
SOAP API テスト: SOAP レスポンスを解析および検証します
動的変数: 抽出した XML 値を後続のリクエストで使用するために保存します
テストアサーション: XML レスポンスデータに基づいてアサーションを作成します
データ抽出: 複雑にネストされた XML 構造から特定のフィールドを取り出します
現代の API では JSON の方が一般的ですが、多くのレガシーシステムや SOAP ベースのサービスでは、現在も XML が使用されています。XPath は、これらの API をテストするために不可欠です。
参考資料#