ToolDeck

XPath テスター

XPath式をXMLに対してテストし、一致するすべてのノードを確認

サンプルを試す

XML入力

ローカルで実行 · シークレットの貼り付けも安全

XPathとは?

XPath(XML Path Language)は、XMLドキュメントからノードを選択するためのクエリ言語です。W3CがXSLT標準の一部として定義したXPathは、XMLドキュメントをノードのツリーとして扱い、そのツリーをたどるためのパスベースの構文を提供します。たとえば //book[@category="fiction"]/title というXPath式は、category属性が "fiction" に等しいbook要素の中にあるすべてのtitle要素を選択します。すべての主要なブラウザと多くのXMLライブラリがサポートするXPath 1.0は、1999年にW3C勧告として公開され、現在も最も広く使われているバージョンです。

XPath式は4種類の結果型のいずれかを返します。ノードセット、文字列、数値、またはブール値です。ノードセットは最も一般的な結果型で、0個以上のXMLノード(要素、属性、テキストノード、コメント、処理命令)を含みます。文字列、数値、ブール値の結果は、count()、sum()、contains() といったXPath関数やブール比較から得られます。この型システムにより、XPathはデータの抽出だけでなく、XSLTスタイルシートやXMLスキーマアサーション内の条件ロジック記述にも適しています。

バージョン1.0の式はあらゆる環境で動作します。JavaScriptのdocument.evaluate()、PythonのlxmlおよびElementTree、Javaのjavax.xml.xpath、PHPのDOMXPath、xmllintなどのコマンドラインツールがすべて対応しています。バージョン2.0および3.1はより豊富な型システムと関数を追加しますが、Saxonのような専用エンジンが必要です。デフォルトではバージョン1.0を使用してください。シーケンス、正規表現、高階関数が必要な場合にのみ2.0または3.1を検討し、SaxonまたはBaseXへの依存を受け入れてください。

オンラインXPath テスターを使う理由

正確な式を書くには、ドキュメント構造を理解し実際のデータに対してテストする必要があります。このツールはプロジェクトをセットアップしたりボイラープレートコードを書いたりせずに、式を繰り返し試せるインタラクティブな環境を提供します。

式を即座にテスト
XMLを貼り付け、式を入力すると、一致するノードがリアルタイムで表示されます。コンパイル手順も、REPLのセットアップも、インストールする依存関係も不要です。
🔒
プライバシー優先の処理
すべてのXML解析とクエリ評価は、ネイティブのDOMParserとdocument.evaluate() APIを使用してブラウザ内で実行されます。XMLデータがマシンの外に出ることはありません。
🔍
複雑なクエリをステップごとにデバッグ
各軸と述語を個別にテストすることで、長い式を分解できます。各ステップでどのノードが一致するかを正確に確認してエラーを特定できます。
📋
結果をドキュメントにコピー
一致したノードやスカラー結果をワンクリックでコピーできます。バグレポート、テストアサーション、データ抽出スクリプトへの貼り付けに便利です。

XPath テスターの使用例

フロントエンド開発者
document.evaluate() を呼び出すJavaScriptコードに埋め込む前に、SVG操作やXMLベースの設定に使うXPathセレクターをテストします。
バックエンドエンジニア
PythonやJava、GoでXML抽出ロジックを書く前に、SOAPレスポンスやXML APIペイロードに対してクエリを検証します。
DevOps / インフラ
Mavenのpom.xml、Springビーンズ、CIパイプライン設定などのXML設定ファイルをクエリして、ファイルを編集せずに依存バージョンを抽出したり設定を確認したりします。
QA / テスト自動化
SeleniumやPlaywrightのXPathロケーターをテストスクリプトに追加する前に、構築・検証します。属性の欠落や名前空間プレフィックスなどのエッジケースをテストします。
データエンジニア
ETLパイプラインに組み込む前に、XMLデータフィード(RSS、Atom、XBRL財務レポート)向けのクエリをプロトタイプします。
学習者 / 学生
サンプルXMLを使ってXPathの軸、述語、関数を試してみましょう。結果をすぐに確認できるので、ツリートラバーサルパターンの直感を養えます。

XPath 軸リファレンス

軸は、現在(コンテキスト)ノードを基準としたナビゲーションの方向を定義します。完全な構文は axis::node-test[predicate] ですが、多くの開発者は省略形(//、@、..)を日常的に使用します。この表はすべての1.0軸と実用的な例を示しています。

説明
childchild::bookDirect children named "book"
descendantdescendant::titleAll "title" elements at any depth
parentparent::*The parent of the current node
ancestorancestor::catalogAll ancestors named "catalog"
following-siblingfollowing-sibling::bookSiblings after the current node
preceding-siblingpreceding-sibling::bookSiblings before the current node
attributeattribute::langThe "lang" attribute of the node
selfself::bookThe current node if it is "book"
descendant-or-self//titleShorthand: any "title" in the tree
ancestor-or-selfancestor-or-self::*Current node plus all ancestors

XPath 1.0 関数

この言語は、ノードセット、文字列、数値、ブール値の4カテゴリにわたる27個の組み込み関数を定義しています。クエリを書く際に最もよく使う関数を以下に示します。すべてこのテスターおよびすべての準拠実装でサポートされています。

関数カテゴリ説明
text()Node testSelects text content of a node
position()NumericReturns 1-based position in node set
last()NumericReturns size of current node set
count()NumericCounts nodes: count(//book)
contains()Stringcontains(@class, "active") — substring match
starts-with()Stringstarts-with(title, "The") — prefix match
normalize-space()StringStrips leading/trailing whitespace
string-length()NumericReturns character count of a string
sum()Numericsum(//price) — totals numeric values
not()Booleannot(@disabled) — negation
name()StringReturns element or attribute name

コード例

これらの例は、式をプログラムで評価する方法を示しています。各スニペットは同じcatalog.xmlの構造を使用しているので、言語間のAPI差異を比較できます。

JavaScript (browser)
const xml = `<catalog>
  <book id="1"><title>1984</title><price>7.99</price></book>
  <book id="2"><title>Dune</title><price>12.99</price></book>
</catalog>`

const parser = new DOMParser()
const doc = parser.parseFromString(xml, 'application/xml')

// Select all book titles
const result = doc.evaluate('//book/title', doc, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null)
let node = result.iterateNext()
while (node) {
  console.log(node.textContent) // → "1984", "Dune"
  node = result.iterateNext()
}

// Get a numeric value
const sum = doc.evaluate('sum(//price)', doc, null, XPathResult.NUMBER_TYPE, null)
console.log(sum.numberValue) // → 20.98
Python (lxml)
from lxml import etree

xml = """<catalog>
  <book id="1"><title>1984</title><price>7.99</price></book>
  <book id="2"><title>Dune</title><price>12.99</price></book>
</catalog>"""

tree = etree.fromstring(xml.encode())

# Select elements by attribute
books = tree.xpath('//book[@id="1"]/title/text()')
print(books)  # → ['1984']

# Use predicates with position
first = tree.xpath('//book[1]/title/text()')
print(first)  # → ['1984']

# Boolean check
has_cheap = tree.xpath('boolean(//price[. < 10])')
print(has_cheap)  # → True
Java (javax.xml.xpath)
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.*;
import org.w3c.dom.*;

var factory = DocumentBuilderFactory.newInstance();
var builder = factory.newDocumentBuilder();
var doc = builder.parse(new java.io.File("catalog.xml"));

var xpath = XPathFactory.newInstance().newXPath();

// Select node set
NodeList titles = (NodeList) xpath.evaluate(
    "//book/title", doc, XPathConstants.NODESET
);
for (int i = 0; i < titles.getLength(); i++) {
    System.out.println(titles.item(i).getTextContent());
    // → "1984", "Dune"
}

// Evaluate to number
double total = (double) xpath.evaluate(
    "sum(//price)", doc, XPathConstants.NUMBER
);
System.out.println(total); // → 20.98
CLI (xmllint)
# Select all book titles
xmllint --xpath '//book/title/text()' catalog.xml
# → 1984Dune

# Select by attribute
xmllint --xpath '//book[@id="2"]/title' catalog.xml
# → <title>Dune</title>

# Count nodes
xmllint --xpath 'count(//book)' catalog.xml
# → 2

# Using xmlstarlet for formatted output
xmlstarlet sel -t -v '//book/title' -n catalog.xml
# → 1984
# → Dune

よくある質問

XPath 1.0とXPath 3.1の違いは何ですか?
バージョン1.0には4つのデータ型(ノードセット、文字列、数値、ブール値)と27個の関数があります。バージョン3.1はシーケンス、マップ、配列、日付/時刻型、正規表現、高階関数、JSONサポートを追加します。ブラウザとほとんどの標準ライブラリはバージョン1.0のみを実装しています。バージョン3.1にはSaxonのような専用エンジンが必要です。
特定の属性値を持つノードを選択するにはどうすればよいですか?
属性軸の省略形である @ を使って述語を記述します。たとえば //book[@category="fiction"] は、category属性が "fiction" に等しいすべてのbook要素を選択します。複数の述語を組み合わせることもできます。//book[@category="fiction"][@year > 2000] のように記述します。
XMLに一致する要素があるのにXPathが結果を返さないのはなぜですか?
最も一般的な原因はXMLの名前空間です。XMLにデフォルト名前空間(xmlns="...")が宣言されている場合、プレフィックスがなくても要素はその名前空間に属します。バージョン1.0では、名前空間を登録し式の中でプレフィックスを使用する必要があります。ブラウザのJavaScriptでは、document.evaluate() の第3引数に名前空間リゾルバーを渡してください。
XPathでXMLのコンテンツを変更できますか?
できません。XPathは読み取り専用のクエリ言語です。ノードを選択・評価することはできますが、挿入、削除、更新はできません。XMLを変更するには、XSLT変換、DOM操作メソッド、または編集用の独立したAPIを提供するPythonのlxmlのようなライブラリを使用してください。
XPathのダブルスラッシュ(//)はどういう意味ですか?
ダブルスラッシュはdescendant-or-self軸の省略形です。//title という式は「ドキュメントツリー内のどの深さにあるすべてのtitle要素を選択する」という意味です。完全な形式 /descendant-or-self::node()/title と同等です。式の先頭で // を使うとドキュメント全体を検索し、パスの途中(/catalog//title など)で使うと特定ノードの子孫を検索します。
要素ノードではなくテキストコンテンツを選択するにはどうすればよいですか?
式の末尾に /text() を追加します。たとえば //book/title/text() は、要素ノード自体ではなく、各title要素のテキストコンテンツを文字列ノードとして返します。コード内では、text() を使わずに返された要素ノードの .textContent にアクセスすることもできます。
XPathはXMLのクエリにおいてCSSセレクターより高速ですか?
CSSセレクターはブラウザのHTMLとDOMトラバーサルのために最適化されています。XPathはより表現力が高く、親トラバーサル、兄弟軸、数値述語、CSSセレクターでは表現できない組み込み関数をサポートします。HTMLに対してはCSSセレクター(querySelector)の方が一般的に高速です。XMLに対しては、多くのサーバーサイドライブラリはXPathしか公開しておらず、CSSセレクターは選択肢にもなりません。