Что это за инструмент?
XPath (XML Path Language) — стандарт W3C для навигации и выбора узлов — элементов, атрибутов, текста — внутри XML-документа с помощью компактного синтаксиса, похожего на путь, например `//book[price>30]/title` выбирает каждый `<title>`, у соседнего `<price>` которого значение больше 30, в любом месте документа. XPath используется в таблицах стилей XSLT, инструментах валидации XML, веб-скрейперах, фреймворках автоматизации браузера (Selenium, Playwright) и во многих библиотеках работы с XML на разных языках программирования.
Текущая версия, реализованная во всех основных браузерах — Chrome, Firefox, Safari, Edge, — это XPath 1.0, исходная рекомендация W3C 1999 года. Этот инструмент использует тот же самый нативный движок через API браузера `document.evaluate()`, поэтому результаты здесь совпадают с тем, что вы получили бы в DevTools браузера или в любом JavaScript-коде, запущенном в браузере. Более поздние спецификации XPath 2.0/3.0/3.1 (добавляющие такие возможности, как выражения `for`, последовательности и сопоставление по регулярным выражениям) не реализованы — что это значит на практике, смотрите в вопросах ниже.
Выражение может возвращать один из двух типов результата: набор узлов (ноль или более совпадающих элементов, атрибутов или текстовых узлов, которые этот инструмент сериализует и выводит построчно с указанием количества), либо скалярное значение — число, строку или булево значение, — когда само выражение вычисляет значение, например `count(//book)` или `//book[1]/title = 'Dune'`.
Зачем его использовать?
- Отладьте выражение XPath перед тем, как зашить его в веб-скрейпер, тест на Selenium/Playwright или таблицу стилей XSLT.
- Быстро проверьте, выбирает ли данное выражение XPath ожидаемый узел на реальном примере XML/HTML.
- Смотрите точное количество совпадений и сериализованный вывод вместо того, чтобы гадать по коду.
- Получайте мгновенные, понятные сообщения об ошибках для некорректного XML или неверного синтаксиса XPath вместо непонятного стека вызовов.
- 100% на стороне клиента: ваш XML и выражение никогда не покидают браузер.
Как использовать
- Вставьте или отредактируйте свой XML (или HTML) в поле ввода — пример документа книжного магазина заполнен заранее, чтобы сразу увидеть работу инструмента.
- Введите выражение XPath в поле выражения или отредактируйте предзаполненный пример.
- Нажмите «Evaluate» (или Enter в поле выражения).
- Просмотрите найденные узлы ниже с указанием количества вверху; скалярные результаты (числа, строки, булевы значения) показываются напрямую.
- Если XML или выражение некорректны, вместо результатов появится конкретное сообщение об ошибке.
Пример
Ввод
XML:
<bookstore>
<book><title>The Great Gatsby</title><price>12.99</price></book>
<book><title>Learning XPath</title><price>34.50</price></book>
<book><title>Dune</title><price>45.00</price></book>
</bookstore>
XPath: //book[price>30]/titleРезультат
✓ 2 node(s) matched
<title>Learning XPath</title>
<title>Dune</title>Только у 2 из 3 книг цена выше 30, поэтому возвращается ровно 2 элемента <title> — третья книга (Gatsby, $12.99) корректно исключена.
XPath и CSS-селекторы: сравнение вкратце
Оба языка выбирают узлы из документа, но решают разные задачи. Используйте эту таблицу, чтобы выбрать подходящий инструмент для конкретной задачи выбора.
| Возможность | XPath | CSS-селекторы |
|---|---|---|
| Выбор по тегу/классу/id вниз по дереву | Да | Да — и обычно быстрее |
| Выбор по видимому/текстовому содержимому | Да — `contains(text(),'x')` | Нет |
| Подъём вверх к родителю/предку | Да — `//div[span]/..` | Нет (`:has()` — новое частичное исключение) |
| Сравнение по значению соседа (например, `price>30`) | Да | Нет |
| Работает вне браузера (серверные XML-инструменты, XSLT) | Да | Нет — CSS-селекторы специфичны для браузера/DOM |
Похожие инструменты
Работаете со структурированными форматами данных? Эти инструменты хорошо сочетаются с тестированием XPath.
Часто задаваемые вопросы
Для чего используется XPath?
XPath выбирает узлы — элементы, атрибуты или текст — из XML- или HTML-документа с помощью синтаксиса путей. Это язык выбора, лежащий в основе преобразований XSLT и многих валидаторов XML, а также широко применяется в веб-скрейпинге и автоматизации тестирования браузера (Selenium, Playwright, Cypress) для поиска элементов на странице — особенно когда одних CSS-селекторов недостаточно, чтобы выразить нужное условие.
XPath или CSS-селекторы — что выбрать?
Они пересекаются, но не эквивалентны. XPath может выбрать родителя на основе содержимого потомка (`//div[span='Total']`), подняться вверх к предкам и выбирать по видимому тексту (`//button[contains(text(),'Submit')]`) — CSS-селекторы не могут двигаться вверх по дереву и вообще не умеют сопоставлять по текстовому содержимому. Если вы просто выбираете по тегу, классу или ID, двигаясь вниз по документу, CSS-селекторы проще писать и обычно быстрее вычисляются. Обращайтесь к XPath именно тогда, когда нужно «выбрать родителя этого текста» или «выбрать по тому, что написано в элементе», а не только по его тегу или классу.
Поддерживает ли этот инструмент функции XPath 2.0 или 3.0?
Нет — и ни один браузер их не поддерживает. Браузеры реализуют XPath 1.0 (рекомендацию W3C 1999 года) через `document.evaluate()`, и этот инструмент использует тот же самый нативный движок, поэтому его результаты точно соответствуют тому, что вы получили бы, выполнив то же выражение в DevTools браузера или в JavaScript. Функции и возможности, появившиеся в XPath 2.0/3.0/3.1 (такие как выражения `for`, последовательности или `matches()` с регулярными выражениями), недоступны — здесь работают только функции 1.0, такие как `contains()`, `starts-with()`, `substring()`, `count()`, `position()` и `last()`.
Какие распространённые выражения XPath стоит знать?
`//tag` выбирает каждый `<tag>` в любом месте документа. `//tag[@attr='value']` выбирает элементы `<tag>`, у которых атрибут `attr` равен `value`. `//tag[contains(text(),'x')]` выбирает элементы `<tag>`, чей непосредственный текст содержит `x`. `//tag[1]` выбирает первый по счёту `<tag>` среди соседей внутри каждого родителя. `//parent/child` выбирает элементы `<child>`, являющиеся непосредственными потомками `<parent>`. `count(//tag)` возвращает число вместо набора узлов.
Обрабатывает ли этот инструмент пространства имён XML?
Корректно поддерживается только распространённый случай без пространств имён, который покрывает подавляющее большинство рукописного или спарсенного XML/HTML. Если ваш документ объявляет пространство имён XML (например, `xmlns="..."` на корневом элементе), `document.evaluate` требует функцию-резолвер, учитывающую пространства имён и сопоставляющую префиксы с URI, а этот простой инструмент её не настраивает — выражения к XML с пространствами имён могут возвращать ноль совпадений, даже если выглядят корректными. Это известное ограничение, а не ошибка: уберите объявление пространства имён из вашего примера или используйте функцию local-name() как обходной путь (например, `//*[local-name()='title']`).
Отправляется ли мой XML или выражение XPath на сервер?
Нет. Всё работает локально с помощью встроенных в браузер `DOMParser` и `document.evaluate()` — того же движка, который браузер уже использует внутри себя. Ничего из введённого или вставленного никогда не покидает ваше устройство.