XPath Tester

Проверяйте XPath-выражения на соответствие XML и смотрите все совпадающие узлы

Попробовать пример

XML-входные данные

Работает локально · Безопасно вставлять секреты

Что такое XPath?

XPath (XML Path Language) — это язык запросов для выбора узлов из XML-документа. Определённый консорциумом W3C как часть стандарта XSLT, XPath рассматривает XML-документ как дерево узлов и предоставляет синтаксис на основе путей для навигации по этому дереву. Выражение XPath вида //book[@category="fiction"]/title выбирает каждый элемент title внутри элемента book, атрибут category которого равен "fiction". XPath 1.0, версия, поддерживаемая всеми основными браузерами и большинством XML-библиотек, опубликована как рекомендация W3C в 1999 году и остаётся наиболее широко применяемой версией.

XPath-выражения возвращают один из четырёх типов результатов: наборы узлов, строки, числа или булевы значения. Набор узлов — наиболее распространённый результат; он содержит ноль или более XML-узлов (элементов, атрибутов, текстовых узлов, комментариев или инструкций обработки). Строковые, числовые и булевы результаты получаются из XPath-функций, таких как count(), sum(), contains(), и булевых сравнений. Эта система типов делает XPath пригодным как для извлечения данных, так и для написания условной логики в XSLT-таблицах стилей и утверждениях XML Schema.

Выражения версии 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 и вычисление запросов происходят в браузере с помощью встроенных API DOMParser и document.evaluate(). Ваши XML-данные никогда не покидают компьютер.
🔍
Пошаговая отладка сложных запросов
Разбивайте длинные выражения, тестируя каждую ось и предикат по отдельности. Смотрите, какие узлы совпадают на каждом шаге, чтобы точно локализовать ошибки.
📋
Копирование результатов для документации
Копируйте совпадающие узлы или скалярные результаты одним кликом. Удобно для вставки в отчёты об ошибках, проверочные утверждения или скрипты извлечения данных.

Сценарии использования XPath Tester

Frontend-разработчик
Проверяйте XPath-селекторы для манипуляций с SVG или XML-конфигурациями перед встраиванием их в JavaScript-код, вызывающий document.evaluate().
Backend-инженер
Проверяйте запросы к SOAP-ответам или XML API-нагрузкам перед написанием логики извлечения данных на Python, Java или Go.
DevOps / Инфраструктура
Запрашивайте XML-файлы конфигурации (Maven pom.xml, Spring beans, конфигурации CI-пайплайнов) для извлечения версий зависимостей или проверки настроек без редактирования файлов.
QA / Автоматизация тестирования
Создавайте и проверяйте XPath-локаторы для Selenium или Playwright перед добавлением их в тестовые скрипты. Проверяйте граничные случаи: отсутствующие атрибуты или префиксы пространств имён.
Инженер по данным
Прототипируйте запросы для XML-каналов данных (RSS, Atom, финансовые отчёты XBRL) перед подключением их к ETL-конвейерам.
Студент / обучающийся
Экспериментируйте с осями XPath, предикатами и функциями на примерных XML-документах. Смотрите результаты немедленно, чтобы выработать интуицию для паттернов обхода дерева.

Справочник по осям 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

Язык определяет 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 имеет четыре типа данных (набор узлов, строка, число, булево) и 27 функций. Версия 3.1 добавляет последовательности, отображения, массивы, типы даты/времени, регулярные выражения, функции высшего порядка и поддержку JSON. Браузеры и большинство стандартных библиотек реализуют только версию 1.0. Версия 3.1 требует специализированного движка, например Saxon.
Как выбрать узлы с определённым значением атрибута?
Используйте предикат с сокращённой формой @ для оси атрибутов. Например, //book[@category="fiction"] выбирает все элементы book, у которых атрибут category равен "fiction". Можно комбинировать несколько предикатов: //book[@category="fiction"][@year > 2000].
Почему мой XPath не возвращает результатов, хотя XML содержит подходящие элементы?
Наиболее частая причина — пространства имён XML. Если ваш XML объявляет пространство имён по умолчанию (xmlns="..."), элементы принадлежат этому пространству имён, даже без префикса. В версии 1.0 нужно зарегистрировать пространство имён и использовать префикс в выражении. В JavaScript браузера передайте функцию разрешения пространств имён третьим аргументом document.evaluate().
Может ли XPath изменять содержимое XML?
Нет. Это язык запросов только для чтения. Он выбирает и вычисляет узлы, но не может вставлять, удалять или обновлять их. Для изменения XML используйте XSLT-трансформации, методы манипуляции DOM или библиотеку, например lxml для Python, предоставляющую отдельные API для редактирования.
Что означает двойная косая черта (//) в XPath?
Двойная косая черта — сокращённая запись оси descendant-or-self. Выражение //title означает «выбрать все элементы title в любом месте дерева документа, на любой глубине». Это эквивалентно полной форме /descendant-or-self::node()/title. Использование // в начале выражения выполняет поиск по всему документу; использование в середине пути (например, /catalog//title) ищет среди потомков конкретного узла.
Как выбрать текстовое содержимое вместо узла элемента?
Добавьте /text() к вашему выражению. Например, //book/title/text() возвращает текстовое содержимое каждого элемента title как строковый узел, а не сам узел элемента. В коде можно также обращаться к .textContent у возвращённого узла элемента без использования text().
Быстрее ли XPath, чем CSS-селекторы для запросов к XML?
CSS-селекторы оптимизированы для HTML и обхода DOM в браузерах. XPath более выразителен: он поддерживает обход к родительским узлам, оси сиблингов, числовые предикаты и встроенные функции, которые CSS-селекторы не могут выразить. Для HTML CSS-селекторы (querySelector) обычно быстрее. Для XML большинство серверных библиотек предоставляют только XPath — CSS-селекторы там вообще недоступны.