XPath
Введение
XPath (XML Path Language) — язык адресации узлов в XML- и HTML-подобных деревьях. XPath используют в XSLT, XQuery, Schematron, в API .NET (XmlDocument.SelectNodes), Java (javax.xml.xpath), в тестах и инструментах (xmlstarlet, браузерные DevTools).
Базовый XML для примеров ниже:
<library>
<book id="1" genre="classic">
<title>Война и мир</title>
<author>Лев Толстой</author>
<price>450</price>
</book>
<book id="2" genre="novel">
<title>Мастер и Маргарита</title>
<author>Михаил Булгаков</author>
<price>380</price>
</book>
</library>
Основы XML: глава XML. Синтаксис XPath в XSLT-паттернах (match) — XSLT.
Терминология
| Термин | Описание |
|---|---|
| Узел (node) | Элемент, атрибут, текст, комментарий, PI, корень документа |
| Контекстный узел | Узел, относительно которого вычисляется выражение |
| Контекстная позиция | Порядковый номер среди узлов, отобранных предыдущим шагом |
| Контекстный размер | Общее число таких узлов |
| Шаг (step) | Ось + тест узла, например child::book |
| Путь (location path) | Цепочка шагов: /library/book/title |
| Предикат | Условие в [...], сужающее набор узлов |
| Последовательность узлов | Упорядоченный набор узлов (результат многих выражений) |
Типы узлов в XPath 1.0:
- element, attribute, text, comment, processing-instruction, namespace, root
Синтаксис путей
Абсолютный и относительный путь
| Запись | Смысл |
|---|---|
/library | От корня документа к элементу library |
book | Дочерние book контекстного элемента |
//author | Все author на любой глубине (ось descendant-or-self) |
. | Текущий контекстный узел |
.. | Родитель (parent::node()) |
@id | Атрибут id текущего элемента |
text() | Текстовые дочерние узлы |
Примеры к документу выше:
/library/book /* все книги */
/library/book[1]/title /* заголовок первой книги */
/library/book[@id='2'] /* книга с id=2 */
//author /* оба автора */
//book[price > 400]/title /* дорогие книги — заголовки */
Тесты узлов
| Тест | Пример |
|---|---|
| По имени элемента | book, title |
| По имени атрибута | @genre |
| Универсальный | * (любой элемент), @* (любой атрибут) |
| По типу узла | node(), text(), comment() |
| По локальному имени с NS | В XPath 2.0+ — QName; в 1.0 часто префиксы в документе |
Оси (axes)
Ось задаёт направление обхода дерева относительно контекстного узла.
| Ось | Сокращение | Что выбирает |
|---|---|---|
child | (по умолчанию) | Прямые дочерние элементы |
attribute | @ | Атрибуты |
descendant | Все потомки | |
descendant-or-self | // в начале шага | Узел и все потомки |
parent | .. | Родитель |
ancestor | Все предки | |
ancestor-or-self | Узел и предки | |
following-sibling | Следующие соседи | |
preceding-sibling | Предыдущие соседи | |
following | Все узлы после в документе | |
preceding | Все узлы до в документе | |
self | . | Сам контекстный узел |
namespace | Узлы пространств имён |
Полная запись шага: ось::тестузла[предикат].
/descendant::book[@genre='classic']/child::title
ancestor::library
following-sibling::book[1]
Базис: Операторы — оператор, операнд и приоритет в коде.
Операторы и выражения
Сравнение и логика
| Оператор | Пример |
|---|---|
=, != | [@id='2'], [author != ''] |
<, <=, >, >= | [price > 400] (числа — если типизировано; в 1.0 часто лексикографически) |
and, or, not() | [genre='novel' and price < 400] |
Арифметика (XPath 1.0 — над числами в выражениях)
+, -, *, div, mod — например //book[position() mod 2 = 1] (нечётные позиции).
Объединение путей
| — объединение двух наборов узлов:
//book/title | //book/author
Полезные функции (XPath 1.0)
| Функция | Назначение |
|---|---|
position() | Позиция в текущем списке |
last() | Размер списка |
count(//book) | Число узлов |
contains(s, sub) | Подстрока |
starts-with(s, p) | Префикс строки |
normalize-space(s) | Обрезка пробелов |
string(), number(), boolean() | Приведение типов |
concat(a, b, ...) | Склейка строк |
//book[contains(author, 'Толстой')]
//book[last()]/title
count(//book[@genre='novel'])
XPath 2.0/3.0 (XQuery, Saxon, современный .NET) добавляют типы, регулярные выражения, for, if, последовательности — см. справочник по XML (раздел XDM).
Практические примеры
| Задача | Выражение |
|---|---|
| Все идентификаторы книг | //book/@id |
| Первая книга | (//book)[1] или //book[1] * |
| Книги без цены | //book[not(price)] |
| Суммарно жанры | //book/@genre |
Заголовок родительской книги для author | //author/ancestor::book/title |
* В XPath 1.0 //book[1] — первая книга в каждом контексте предиката; для «первой в документе» надёжнее (//book)[1].
Чит-лист: cheatsheets.zip/xpath
Где применяется XPath
- XSLT — атрибуты
select,match,test; - XSD 1.1 — ограничения
assert; - Schematron — правила валидации;
- Тестирование API — проверка тела SOAP/XML;
- Конфигурации — Spring, Maven, MSBuild (внутренние селекторы в плагинах);
- Браузер — оценка XPath в консоли для XML/SVG.
См. также
Другие статьи этого же раздела в боковом меню (как на странице «О разделе»). Форматы хранения настроек и данных. Организация данных в текстовых файлах. Текстовые форматы данных - представление информации в виде последовательностей символов для обмена и человекочитаемой обработки. Не путать с цифрами в окружении — ① (U+2460) — это circled digit one, не эмодзи (Emoji=No). Шрифт как цифровая реализация гарнитуры - контуры символов, метрики и отличие от понятия «начертание». Универсальный язык разметки — синтаксис, пространства имён, валидация XSD, CSS и связь с XPath, XSLT и DOM. Примечание — xN означает шестнадцатеричное представление Unicode-кода символа. XSLT-таблица — это XML-документ (обычно с пространством имён http — //www.w3.org/1999/XSL/Transform, сокращённо xsl — ). Корневой элемент — или (синонимы). Преобразование XML — таблицы стилей, шаблоны xsl:*, сортировка, ветвление, клиент и сервер. Модель документа XML — типы узлов, коллекции, обход дерева и навигация в API. MessagePack, BSON, Protocol Buffers и CBOR — когда выбирать бинарную сериализацию вместо JSON и YAML в API и очередях. JSON как текстовый формат обмена данными между системами, основанный на объектах и массивах с явной структурой. Ключи и значения разделяются двоеточием ( — ), за которым следует пробел.Конфигурационные данные в текстовых форматах
Текстовые форматы представления данных
Справочник по эмодзи
Шрифты
XML
Справочник по XML
Справочник по XSLT
XSLT
XML DOM
Бинарные форматы обмена данными
JSON
YAML