Лев Корольков
Руководитель IT-департамента EFSOL Oblako
Время чтения: 12 мин

XPath

(язык запросов XML)
XPath — язык для поиска и выбора узлов в XML и HTML-документах. Используется в парсинге, тестировании интерфейсов, интеграциях, обработке данных и автоматизации бизнес-процессов.

XPath, или XML Path Language, — это язык выражений для навигации по структуре XML-документа. С его помощью можно выбрать нужные элементы, атрибуты, текстовые значения или группы узлов по заданному условию. На практике XPath часто применяют не только с XML, но и с HTML: например, чтобы найти кнопку на веб-странице в автотесте, извлечь цену из карточки товара или получить значение из ответа внешней системы.

Главная идея XPath проста: документ рассматривается как дерево. У дерева есть корневой узел, ветви, элементы, атрибуты и текстовые значения. XPath описывает путь к нужной части этого дерева. Поэтому выражение XPath похоже на адрес внутри документа: оно показывает, куда перейти и что взять.

Для бизнеса XPath важен потому, что помогает автоматизировать работу с данными, которые уже представлены в структурированном виде. Это может быть выгрузка из учетной системы, XML-сообщение между сервисами, HTML-страница сайта, отчет поставщика или документ электронного документооборота. Вместо ручного поиска нужного значения система получает точный запрос и стабильно извлекает данные.

Что такое XPath простыми словами

XPath можно представить как способ сказать программе: найди в документе вот этот элемент. Например, в XML есть список заказов, у каждого заказа есть номер, сумма и статус. XPath позволяет выбрать все заказы со статусом Оплачен, получить суммы заказов или найти заказ с конкретным номером.

<orders>
 <order id='101'>
 <status>paid</status>
 <total>4500</total>
 </order>
 <order id='102'>
 <status>new</status>
 <total>1900</total>
 </order>
</orders>

Для такого документа выражение /orders/order/status выберет элементы status внутри всех заказов. А выражение /orders/order[@id=’101′]/total выберет сумму заказа с идентификатором 101.

XPath не изменяет документ. Он только выбирает данные или вычисляет значение на основе документа. Изменение выполняют уже другие инструменты: код приложения, XSLT-преобразование, тестовый фреймворк, парсер или интеграционная платформа.

Где используется XPath

XPath встречается во многих задачах, где нужно работать с документами, имеющими вложенную структуру. Особенно часто он используется в интеграциях, тестировании, веб-скрейпинге и обработке XML.

СценарийКак помогает XPathПример пользы
Интеграции между системамиИзвлекает значения из XML-сообщенийПолучение номера заявки, статуса оплаты, кода клиента
Автотесты веб-интерфейсовНаходит элементы на HTML-страницеКлик по кнопке, проверка текста ошибки, поиск поля формы
Парсинг сайтовВыбирает нужные блоки страницыСбор цен, названий товаров, ссылок, дат публикаций
Обработка отчетовВыбирает данные из XML-выгрузокФормирование сводок и проверка корректности значений
XSLT-преобразованияОпределяет, какие узлы преобразоватьПреобразование XML в HTML, текстовый отчет или другой XML

В корпоративных системах XPath часто работает внутри других инструментов. Пользователь может не писать XPath напрямую, но платформа интеграции, тестовый инструмент или модуль обработки документов использует его для доступа к нужным частям данных.

Как устроен XPath-запрос

XPath-запрос состоит из шагов. Каждый шаг указывает, какие узлы выбрать относительно текущей позиции. Путь может быть абсолютным, когда начинается от корня документа, или относительным, когда считается от текущего узла.

  • Абсолютный путь начинается с корня документа, например /catalog/product/name.
  • Относительный путь начинается от текущего узла, например product/name.
  • Двойная косая черта ищет узлы на любой глубине, например //price.
  • Квадратные скобки задают условие отбора, например //product[price > 1000].
  • Символ @ используется для обращения к атрибутам, например //product[@id=’15’].

Выражение //product означает найти все элементы product в документе, где бы они ни находились. Выражение /catalog/product означает выбрать только те product, которые лежат прямо внутри catalog. Разница важна: слишком широкий запрос может найти лишние элементы, а слишком узкий — ничего не вернуть при небольшом изменении структуры.

Основные элементы синтаксиса

ЗаписьЗначениеПример
/Переход от корня или между уровнями/orders/order
//Поиск на любой глубине//order
.Текущий узел./status
..Родительский узел../total
@Атрибут//order[@id=’101′]
[]Фильтр или позиция//order[status=’paid’]
Любой элемент//

Фильтры делают XPath особенно полезным. Они позволяют выбирать не просто все элементы определенного типа, а только те, которые соответствуют условию: имеют нужный атрибут, содержат определенный текст, стоят на нужной позиции или включают дочерний элемент с заданным значением.

Примеры XPath-выражений

Рассмотрим небольшой XML-документ с товарами. Он похож на данные, которые могут приходить из каталога, системы учета или API поставщика.

<catalog>
 <product id='p1' category='laptop'>
 <name>Business Laptop</name>
 <price>85000</price>
 <available>true</available>
 </product>
 <product id='p2' category='monitor'>
 <name>Office Monitor</name>
 <price>24000</price>
 <available>false</available>
 </product>
</catalog>
ЗадачаXPathЧто вернет
Найти все товары/catalog/productВсе элементы product внутри catalog
Получить названия товаров/catalog/product/nameЭлементы name для всех товаров
Найти товар по id//product[@id=’p1′]Товар с идентификатором p1
Выбрать доступные товары//product[available=’true’]Товары, у которых available равен true
Найти дорогие товары//product[price > 50000]Товары с ценой больше 50000
Получить категории//product/@categoryЗначения атрибута category

Такие выражения могут использоваться в коде приложения, в настройках интеграционной шины, в правилах проверки XML или в тестах. Например, система может проверять, что в сообщении о заказе обязательно есть идентификатор клиента и сумма, а тест может убеждаться, что на странице показана правильная цена.

XPath в HTML и автотестировании

Хотя XPath создавался для XML, он широко применяется для поиска элементов в HTML-документах. В автотестах веб-интерфейсов XPath помогает находить кнопки, поля ввода, ссылки, сообщения об ошибках и элементы таблиц.

Например, если на странице есть кнопка с текстом Отправить, тест может искать ее выражением //button[text()=’Отправить’]. Если кнопка содержит вложенный элемент или дополнительные пробелы, более надежным может быть выражение //button[contains(., ‘Отправить’)].

В бизнес-контексте это полезно для регрессионного тестирования. Компания часто меняет интерфейс личного кабинета, формы заказа или CRM. Автотесты на XPath проверяют, что ключевые сценарии по-прежнему работают: пользователь может войти, оформить заказ, скачать счет, отправить заявку или увидеть корректное уведомление.

Но XPath в HTML требует осторожности. Слишком длинные пути вроде /html/body/div/div/div/table/tr/td/button обычно хрупкие. Если разработчик добавит новый контейнер или изменит верстку, такой локатор сломается. Лучше опираться на устойчивые признаки: id, name, data-атрибуты, доступный текст или стабильную роль элемента.

Абсолютный и относительный путь

Абсолютный XPath начинается от корня документа. Он точный, но часто зависит от полной структуры. Относительный XPath ищет узел от текущего места или по всей странице, поэтому обычно гибче.

Тип путиПримерКогда использовать
Абсолютный/catalog/product/nameКогда структура XML стабильна и строго задана
Относительный//product/nameКогда элемент может находиться на разной глубине
Контекстный./nameКогда поиск идет внутри уже выбранного товара

В интеграциях абсолютные пути удобны, когда формат сообщения закреплен договоренностью и меняется редко. В тестировании веб-страниц чаще используют относительные выражения, потому что HTML-структура меняется чаще, чем бизнес-смысл элемента.

Функции XPath

XPath поддерживает функции, которые помогают сравнивать, искать текст, считать узлы и нормализовать значения. Набор функций зависит от версии XPath и инструмента, который его выполняет, но базовые функции встречаются очень часто.

  • text() выбирает текстовый узел элемента.
  • contains() проверяет, содержит ли строка нужный фрагмент.
  • starts-with() проверяет начало строки.
  • normalize-space() убирает лишние пробелы в начале, конце и внутри текста.
  • count() считает количество выбранных узлов.
  • position() позволяет работать с позицией узла в наборе.
  • last() обращается к последнему узлу в наборе.

Пример: //div[contains(normalize-space(.), ‘Ошибка’)] может найти блок, в котором отображается сообщение об ошибке, даже если в HTML есть лишние пробелы или переносы строк. Для тестов это часто надежнее, чем точное сравнение текста.

Функции помогают писать более гибкие выражения, но ими не стоит злоупотреблять. Слишком сложный XPath трудно читать, поддерживать и отлаживать. Если выражение занимает несколько строк и содержит много условий, возможно, лучше улучшить структуру данных или добавить стабильные атрибуты в HTML.

XPath в интеграциях и обмене данными

В интеграционных сценариях XPath часто используют для маршрутизации, валидации и преобразования сообщений. Например, система получает XML от поставщика и должна понять, к какому процессу его отправить. XPath может выбрать значение типа документа, статус операции или код организации.

Типичный сценарий: интеграционная платформа получает XML-заказ. С помощью XPath она проверяет, что поле /order/customer/id заполнено, значение /order/total больше нуля, а /order/status равно new. Если условия выполнены, сообщение отправляется в CRM. Если нет — попадает в очередь ошибок.

Это снижает ручную работу и уменьшает риск неправильной обработки данных. Вместо того чтобы писать отдельный код для каждого поля, администратор или разработчик задает правила выбора данных. В больших компаниях такой подход помогает поддерживать десятки интеграционных потоков.

XPath особенно полезен там, где важно быстро и однозначно достать значение из структурированного документа без ручного просмотра всего файла.

Преимущества XPath

  • Точность: можно выбрать конкретный элемент, атрибут или текстовое значение.
  • Гибкость: поддерживаются условия, функции и поиск на разной глубине.
  • Распространенность: XPath поддерживают многие языки программирования, тестовые фреймворки и XML-инструменты.
  • Удобство для XML: язык хорошо соответствует древовидной структуре XML-документов.
  • Применимость к HTML: XPath можно использовать для поиска элементов на веб-страницах.

Для команды разработки XPath удобен еще и тем, что выражения можно обсуждать отдельно от кода. Аналитик, тестировщик и разработчик могут договориться, какое поле нужно извлечь, и зафиксировать это в спецификации интеграции или тестовом сценарии.

Ограничения и риски

XPath не решает все задачи работы с данными. Он хорошо выбирает узлы из документа, но не заменяет полноценную бизнес-логику, нормальную модель данных или проверку качества входящей информации.

РискЧто может произойтиКак снизить риск
Хрупкие выраженияXPath ломается после изменения структуры HTML или XMLИспользовать стабильные атрибуты и избегать чрезмерно длинных путей
Слишком широкий поискВыражение возвращает лишние элементыДобавлять контекст и условия отбора
Разные версии XPathФункция работает в одном инструменте, но не работает в другомПроверять поддержку версии XPath в конкретной среде
Проблемы с пространствами именЗапрос не находит элемент в XML с namespaceНастроить префиксы пространств имен в парсере
Низкая читаемостьКоманде трудно поддерживать сложные выраженияДокументировать правила и разбивать логику на простые шаги

Особое внимание нужно уделять пространствам имен XML. Визуально элемент может выглядеть как обычный tag, но если он находится в namespace, простой запрос //tag может не сработать. В таких случаях в коде или инструменте нужно правильно настроить префикс пространства имен и использовать его в XPath.

Распространенные ошибки

Слишком длинный путь от корня

Ошибка возникает, когда выражение полностью повторяет техническую структуру документа или страницы. Например, в HTML такой путь зависит от множества контейнеров и легко ломается. Лучше искать элемент по смысловому признаку: тексту, атрибуту или связи с соседним элементом.

Использование позиции без необходимости

Выражение //div[3]/button[2] может работать сегодня, но перестать работать после добавления нового блока. Позиционные фильтры полезны, когда порядок действительно является частью бизнес-логики, например первая строка таблицы или последний элемент списка. В остальных случаях лучше использовать более явные условия.

Игнорирование пробелов в тексте

HTML часто содержит переносы строк и лишние пробелы. Поэтому точное выражение //button[text()=’Сохранить’] может не найти кнопку. В таких случаях помогает normalize-space(), например //button[normalize-space(.)=’Сохранить’].

Смешение XPath и CSS-селекторов

XPath и CSS-селекторы похожи тем, что оба могут находить элементы в HTML, но синтаксис у них разный. Запись .button.primary — это CSS-селектор, а не XPath. В тестовом инструменте важно выбрать правильный тип локатора.

XPath и CSS-селекторы

В веб-разработке XPath часто сравнивают с CSS-селекторами. Оба подхода используются для поиска элементов на странице, но имеют разные сильные стороны.

КритерийXPathCSS-селектор
Поиск по текстуПоддерживается во многих инструментахОбычно ограничен
Переход к родителюВозможен через ..Исторически был ограничен, зависит от поддержки селекторов
Читаемость для фронтендаМожет быть менее привыченОбычно привычен веб-разработчикам
Работа с XMLОсновной сценарий примененияНе предназначен для XML-логики
АвтотестыПолезен для сложных условийУдобен для классов, id и простых структур

Выбор зависит от задачи. Для веб-страниц CSS-селекторы часто проще и быстрее читаются командой. XPath выигрывает, когда нужно искать по тексту, подниматься к родительскому элементу или описывать более сложные условия. Для XML XPath обычно является естественным выбором.

Версии XPath

Существуют разные версии XPath. XPath 1.0 широко поддерживается и часто встречается в браузерах, тестовых инструментах и старых XML-библиотеках. Более новые версии, такие как XPath 2.0 и XPath 3.1, добавляют развитые типы данных, расширенные функции и более мощные выражения.

На практике важно не только знать версию языка, но и понимать, какую версию поддерживает конкретный инструмент. Например, выражение, написанное для XPath 2.0, может не выполниться в среде, где доступен только XPath 1.0. Это особенно важно при переносе правил между платформами или при обновлении интеграционного решения.

Как писать надежные XPath-выражения

  1. Начинайте с бизнес-смысла: что именно нужно найти и почему.
  2. Используйте стабильные признаки: id, name, data-атрибуты, тип документа, код поля.
  3. Не делайте путь длиннее, чем нужно для однозначного выбора.
  4. Проверяйте выражение на нескольких примерах документов, а не только на одном.
  5. Учитывайте пространства имен XML, если они есть в документе.
  6. Документируйте сложные выражения в спецификациях и тест-кейсах.
  7. Избегайте зависимости от случайного порядка элементов, если порядок не закреплен бизнес-правилом.

Хороший XPath должен быть не только рабочим, но и поддерживаемым. Через несколько месяцев другой разработчик или тестировщик должен понять, что именно выбирает выражение и почему оно написано именно так.

Практический пример для бизнеса

Допустим, компания получает XML-сообщения от партнеров о статусах доставок. Нужно автоматически находить отправления, которые задержаны, и создавать задачу для менеджера.

<shipments>
 <shipment number='A100'>
 <status>delayed</status>
 <manager>Ivanov</manager>
 </shipment>
 <shipment number='A101'>
 <status>delivered</status>
 <manager>Petrova</manager>
 </shipment>
</shipments>

XPath //shipment[status=’delayed’] выберет все задержанные отправления. Выражение //shipment[status=’delayed’]/@number вернет их номера. Эти данные можно передать в CRM, систему уведомлений или отчет для операционного отдела.

Такой сценарий показывает практическую ценность XPath: он связывает техническую структуру документа с бизнес-действием. Система не просто читает XML, а принимает решение на основе конкретных полей.

Связанные термины

  • XML — формат разметки для хранения и передачи структурированных данных.
  • HTML — язык разметки веб-страниц, в котором XPath часто применяют для поиска элементов.
  • XSLT — язык преобразования XML-документов, активно использующий XPath.
  • DOM — объектная модель документа, представляющая HTML или XML как дерево узлов.
  • CSS-селектор — способ выбирать элементы HTML по тегам, классам, атрибутам и другим признакам.
  • Парсинг — автоматический разбор документа или страницы для извлечения данных.
  • Веб-скрейпинг — сбор данных с веб-страниц с помощью программных инструментов.

Краткий итог

XPath — это язык запросов к XML- и HTML-документам, который позволяет находить элементы, атрибуты и текстовые значения внутри древовидной структуры. Он полезен в интеграциях, автотестировании, парсинге, проверке данных и преобразовании документов.

Главная сила XPath — точный выбор нужных данных по пути и условиям. Главный риск — хрупкие или слишком сложные выражения, которые трудно поддерживать. Поэтому в рабочих проектах XPath стоит писать с опорой на стабильную структуру, понятные бизнес-правила и реальные примеры данных.

Частые вопросы

5 вопросов
Что такое XPath?

XPath — это язык выражений для поиска и выбора элементов, атрибутов и текстовых значений в XML-документах. Также его часто используют для работы с HTML-страницами.

Чем XPath отличается от CSS-селектора?

CSS-селекторы чаще применяют для простого поиска HTML-элементов по тегам, классам и атрибутам. XPath лучше подходит для XML, поиска по тексту, сложных условий и переходов по дереву документа.

Где XPath используется на практике?

XPath используют в интеграциях, XSLT-преобразованиях, автотестах веб-интерфейсов, парсинге сайтов, проверке XML-сообщений и обработке структурированных отчетов.

Почему XPath-запрос может не находить элемент?

Причины могут быть разными: изменилась структура документа, указан слишком жесткий путь, есть лишние пробелы в тексте, используется namespace в XML или инструмент поддерживает не ту версию XPath.

Как сделать XPath более надежным?

Лучше использовать стабильные атрибуты, понятные условия, контекстный поиск и normalize-space() для текста. Не стоит строить длинные пути от корня, если структура страницы или документа часто меняется.

Была ли статья полезна?
Документ обновляется командой EFSOL. Свяжитесь с нами, если нашли неточность.
Нужна консультация?

Поможем спроектировать, развернуть и сопроводить облачную или гибридную инфраструктуру под задачи вашего бизнеса.

Ответим в течение часа в рабочее время
Заказать звонок

Оставьте свои данные для того, чтобы специалист с вами связался.

Заказать звонок

Оставьте свои данные для того, чтобы специалист с вами связался.