XPath
XPath (XML Path Language) — это язык запросов для навигации по структурированным документам, таким как XML и HTML, а также для извлечения данных из них. XPath использует синтаксис, основанный на путях (path expressions), для указания местоположения узлов (элементов, атрибутов, текста) в древовидной модели документа. Язык является ключевым компонентом технологий XSLT (XSL Transformations) и XQuery, а также широко применяется в веб-скрапинге, тестировании программного обеспечения и обработке данных.
История
XPath был разработан консорциумом W3C (World Wide Web Consortium) как часть семейства стандартов XML. Первая версия, XPath 1.0, была опубликована 16 ноября 1999 года. Она стала основой для XSLT 1.0 и XPointer. Основной целью было создание простого и эффективного способа адресации частей XML-документа, который был бы удобен как для машинной обработки, так и для использования человеком.
Вторая версия, XPath 2.0, вышла 23 января 2007 года. Она значительно расширила возможности языка: добавила поддержку строгой типизации (на основе XML Schema), более мощные функции для работы со строками, числами и датами, а также поддержку последовательностей (sequences) вместо наборов узлов. XPath 2.0 был тесно интегрирован с XSLT 2.0 и XQuery 1.0.
Текущая версия, XPath 3.0, была опубликована 8 апреля 2014 года, а XPath 3.1 — 21 марта 2017 года. Эти версии добавили поддержку карт (maps) и массивов (arrays), анонимных функций, более богатые возможности для работы с регулярными выражениями и JSON. XPath 3.1 стал частью XSLT 3.0 и XQuery 3.1.
Основные понятия
Модель данных
XPath оперирует с абстрактной моделью документа, построенной на основе DOM (Document Object Model). Документ представляется в виде дерева узлов, где каждый узел имеет тип. Основные типы узлов:
- Узел документа (document node): корневой узел, представляющий весь документ.
- Узел элемента (element node): соответствует XML-элементу (например,
<book>). - Узел атрибута (attribute node): соответствует атрибуту элемента (например,
id="123"). - Текстовый узел (text node): содержит текстовое содержимое элемента.
- Узел комментария (comment node): соответствует комментарию в XML.
- Узел инструкции по обработке (processing instruction node): соответствует инструкциям типа
<?xml-stylesheet ...?>. - Узел пространства имён (namespace node): соответствует объявлению пространства имён.
Пути (Path Expressions)
Основным синтаксическим элементом XPath является путь, который состоит из последовательности шагов (steps), разделённых символом / (косая черта). Путь может быть:
- Абсолютным: начинается с корневого узла (символ
/). Например:/catalog/book/price— выбирает все элементыprice, являющиеся потомками элементаbook, который является потомком корневого элементаcatalog. - Относительным: начинается с текущего контекстного узла. Например:
book/author— выбирает все элементыauthor, которые являются прямыми потомками текущего элементаbook.
Оси (Axes)
Каждый шаг пути может использовать ось (axis), которая определяет направление навигации по дереву относительно контекстного узла. Основные оси:
child(дочерние узлы) — ось по умолчанию.descendant(все потомки).parent(родительский узел).ancestor(все предки).following-sibling(следующие соседние узлы).preceding-sibling(предыдущие соседние узлы).attribute(атрибуты).self(сам узел).descendant-or-self(потомки и сам узел).
Пример с осью: //author — сокращение от /descendant-or-self::node()/child::author — выбирает все элементы author в документе.
Предикаты (Predicates)
Предикаты — это условия, заключённые в квадратные скобки [], которые фильтруют набор узлов. Они позволяют выбирать узлы по их положению, значению, наличию атрибутов и т.д.
Примеры:
book[1]— выбирает первый элементbook.book[@id="b123"]— выбирает элементbookс атрибутомid, равным"b123".book[price > 10]— выбирает элементыbook, у которых дочерний элементpriceимеет значение больше 10.
Функции
XPath включает множество встроенных функций для работы с различными типами данных:
- Строковые функции:
string(),concat(),substring(),contains(),starts-with(),normalize-space(). - Числовые функции:
number(),sum(),count(),floor(),ceiling(),round(). - Логические функции:
not(),boolean(),true(),false(). - Функции для работы с узлами:
name(),local-name(),namespace-uri(),position(),last(). - Функции для работы с последовательностями (XPath 2.0+):
distinct-values(),insert-before(),remove(),reverse().
Синтаксис и примеры
Сокращённый синтаксис (Abbreviated Syntax)
Наиболее распространённая форма XPath использует сокращения:
nodename— выбирает всех потомков с именемnodename./— выбирает от корневого узла.//— выбирает узлы в документе, независимо от их расположения (рекурсивный поиск)..— выбирает текущий узел...— выбирает родительский узел.@— выбирает атрибуты (например,@id).
Примеры выражений
Рассмотрим XML-документ:
``xml <catalog> <book id="b1" lang="en"> <title>XML Programming</title> <author>John Doe</author> <price>29.99</price> </book> <book id="b2" lang="ru"> <title>Основы XPath</title> <author>Иван Петров</author> <price>15.00</price> </book> </catalog> ``
Выражения XPath и их результаты:
/catalog/book/title— выбирает два элемента<title>: "XML Programming" и "Основы XPath".//title/text()— выбирает текстовые узлы всех элементов<title>: "XML Programming", "Основы XPath"./catalog/book[1]— выбирает первый элемент<book>(с id="b1")./catalog/book[@id="b2"]/author— выбирает элемент<author>второй книги: "Иван Петров".//book[price > 20]/title— выбирает заголовки книг, цена которых больше 20: "XML Programming".//book/@id— выбирает все атрибутыidэлементов<book>: "b1", "b2".count(//book)— возвращает количество элементов<book>: 2.//book[contains(title, "XPath")]— выбирает книги, в заголовке которых есть слово "XPath": вторая книга.
Применение
XSLT
XPath является языком запросов в XSLT. XSLT-преобразования используют XPath для выборки узлов из исходного XML-документа и для вычисления значений, которые затем вставляются в результирующий документ. Например, в XSLT-шаблоне выражение select="book/price" указывает, какие узлы обрабатывать.
Веб-скрапинг и парсинг
В веб-скрапинге XPath активно используется для извлечения данных из HTML-страниц. Библиотеки для парсинга, такие как lxml (Python), HtmlAgilityPack (.NET) и jsdom (Node.js), поддерживают XPath. Например, для извлечения всех ссылок со страницы можно использовать выражение //a/@href.
Тестирование ПО
XPath применяется в автоматизированном тестировании веб-приложений (например, с помощью Selenium WebDriver) для поиска элементов на странице. XPath позволяет создавать точные и гибкие локаторы, особенно когда идентификаторы или классы элементов динамически меняются.
Обработка XML-данных
XPath используется в базах данных с поддержкой XML (например, Oracle, PostgreSQL, SQL Server) для запросов к XML-колонкам. В SQL Server функция query() и value() принимают XPath-выражения для извлечения данных.
Инструменты
Для отладки и тестирования XPath-выражений существует множество инструментов:
- Встроенные инструменты браузеров: в консоли разработчика (F12) можно выполнять XPath-запросы к DOM-дереву страницы.
- Онлайн-тестеры: например, XPath Helper (расширение для Chrome), freeformatter.com, codebeautify.org.
- Библиотеки: lxml (Python), Saxon (Java, .NET), XPathNavigator (.NET).
Ограничения и критика
Несмотря на широкое распространение, XPath имеет ряд ограничений:
- Сложность синтаксиса: полный синтаксис XPath 2.0/3.0 значительно сложнее сокращённого, что затрудняет его изучение и отладку.
- Производительность: при работе с большими документами сложные XPath-выражения (особенно с использованием оси
descendantи рекурсивных предикатов) могут выполняться медленно. - Чувствительность к структуре: XPath сильно зависит от точной структуры документа. Изменение вложенности или добавление/удаление элементов может привести к неработоспособности запросов.
- Неоптимальность для HTML: HTML-документы часто имеют невалидную структуру (например, незакрытые теги), что может затруднить применение XPath. Для таких случаев часто предпочтительнее CSS-селекторы.
Тем не менее, XPath остаётся мощным и гибким инструментом для работы с XML и HTML, особенно в тех областях, где требуется точная навигация по структуре документа.
Источники
- W3C Recommendation: XML Path Language (XPath) 1.0
- W3C Recommendation: XML Path Language (XPath) 2.0
- W3C Recommendation: XML Path Language (XPath) 3.1
- Michael Kay. XSLT 2.0 and XPath 2.0 Programmer's Reference. Wiley, 2008.
- Документация библиотеки lxml (Python).
- Документация Selenium WebDriver.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →