Рубріки: Теория

Что такое XPath? Функции и синтаксис

Андрій Денисенко

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

Источник: habr.com

1. Что такое XPath? Отличия от XML

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

XPath применяется для перехода к любому необходимому нам тегу, атрибуту или ​​текстовому блоку и используется в связке с такими технологиями, как XSLT, XQuery, XLink и XPointer. XPath можно использовать в индустрии разработки ПО — почти все языки программирования поддерживают его, — а также при тестировании программного обеспечения, в частности для разработки сценариев автоматизации в Selenium. Кроме всего прочего, он является рекомендуемым языком консорциума World Wide Web (W3C), поэтому с ним стоит разобраться. Сделать это лучше всего с практикующими специалистами, например, с преподавателями из школы наших партнеров Mate Academy.

2. Узлы XPath

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

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

<SoftwareTestersList>
    <softwareTester name="T1">
        <State>Kiew</State>
        <country>UA</country>
    </softwareTester>
    <softwareTester name="T2">
        <State>Odessa</State>
        <country>UA</country>
    </softwareTester>
</SoftwareTestersList>
  1. Корневой узел. Самый верхний узел документа, содержащий все дочерние элементы внутри себя и не имеющий родителя. В приведенном примере корневым узлом является «SoftwareTestersList». Для его выбора используется косая черта ‘/‘.
  2. Узлы элементов. Находятся непосредственно под корневым узлом и могут содержать в себе атрибуты. В основном это теги XML или HTML. В примере им соответствуют: Software Tester, State, Country.
  3. Узлы атрибутов. Определяют свойство (атрибут) элемента и могут находиться не только под узлом элемента, но и под корневым узлом. В нашем примере: «name» — это атрибутный узел тегов softwareTester. Для обозначения применяется значок «@».
  4. Текстовые узлы. К ним относятся все тексты, появляющиеся между узлами элементов, в примере это — «Kiew», «UA», «Odessa».
  5. Узлы комментариев. Комментарии к коду, не обрабатываемые компилятором или интерпретатором языка программирования, помещенные в конструкцию <!... >.
  6. Атомарные значения (Atomic values): Это узлы, не имеющие дочерних и родительских элементов.
  7. Узел контекста: это конкретный текущий узел из XML-документа, обозначаемый точкой (.).

3. Оси (axis) в XPath

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

  1. Self-axis. Для выбора конкретного узла контекста применяется выражение XPath self :: * или .
  2. Child-axis. Чтобы выбрать дочерние элементы контекстного узла, необходимо написать child :: software tester.
  3. Parent-axis. При выборе родительского контекстного узла ось обозначается двойной точкой (..). Например: parent :: State и ../State.
  4. Attribute-axis. Ось атрибутов обозначается символом (@). Например:
    attribute :: name или @name.

4. Пути к элементам XPath

Мы с вами разобрали, что XPath ищет элементы на HTML или XML-страницах.

Для того чтобы добраться к искомому объекту, используются пути. Они являются наиболее полезным и широко используемым свойством XPath. Путь состоит из набора узлов XPath относительно его стартового (чаще всего корневого) элемента.

Есть два вида путей: абсолютный и относительный.

Абсолютным называется путь от корня документа. Он всегда начинается с косой черты “/”.

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

Например:

<html>
<head>
       <body>
                <div class=”mainWrap”>
<h1> Основной заголовок</h1>
                <p>абзац текста</p>
                <div>Блок1</div>
<ul>
            <li>пункт1</li>
<li>пункт2</li>
</ul>
</div>
<div class=”sideBar”>
<div>
<div>пустой блок</div>
<div>
<div>
<table border=”1”>
</body>
</html>

Из примера выше мы видим, что для того, чтобы добраться до тега (<li>пункт 1</li>), нам нужно, начиная с корня документа (<html>), посетить каждый дочерний элемент родителя.

В XPath это будет выглядеть так:

/html/body/div/ul/li[1]

Пример из жизни: есть семиэтажное здание. Чтобы попасть на седьмой этаж по лестнице, нам нужно последовательно посетить все этажи с первого по седьмой — /1/2/3/4/5/6/7. Это будет абсолютный путь.

Относительным называют путь от одного элемента (не обязательно от корневого) к другому. Чаще всего в таких случаях XPath-запрос начинают с «.//» или «//».

Символы «//», проставленные в начале запроса, возвращают полное множество потомков, являющихся дочерними для корня документа, то есть все элементы на текущей странице.

Например:

Чтобы добраться до тега (<li>пункт 1</li>), мы опустим все теги, находящиеся выше тега (<div>), и заменим их на «//». Также можем заменить всех предков тега (<li>) на «//», исключая тег (<div>).

Вот как это будет выглядеть в XPath:

//div//li[1]

Пример из жизни: есть семиэтажное здание. Нам нужно попасть с третьего на седьмой этаж, не посещая этажи четыре, пять, шесть (где живут наши недоброжелатели). Для этого можно воспользоваться лифтом и пропустить их. Наш путь будет выглядеть следующим образом: //3//7. А если нам придется подниматься по лестнице, то наш путь будет выглядеть так:

//3/4/5/6/7

5. Синтаксис XPath

Синтаксис языка запросов немного похож на обозначения, используемые в URL-адресах. XPath выражение — это не что иное, как путь к нужному нам элементу в дереве документа, где каждый уровень отделяется от другого косой чертой «/», а результатом его обработки может быть:

  • node-set или комплект узлов. Например:
/html/body/div

Если применить к предыдущему участку HTML-кода, он вернет два узла элементов div, содержащиеся в элементе body.

  • boolean или логическое выражение:
/html/body/div or p

вернет значение true, так как в элементе body содержится элемент div.

  • number или число. Числа здесь дробные с плавающей запятой. Целочисленный тип данных не учитывается в XPath.
  • string или строка:
/html/body/div/h1['Основной заголовок']

Вернет элемент h1 с текстом «Основной заголовок», содержащийся в первом элементе div.

Ниже перечислены подстановочные знаки, применяемые в XPath-выражениях.

  1. (*) : выберет все узлы элементов контекстного узла (включая текст, комментарии, инструкции и узел атрибутов).
  2. (@ *) : выберет все узлы атрибутов контекстного узла.
  3. Node () : это выберет все узлы контекстного узла (включая пространства имен, текст, атрибуты, элементы, комментарии и инструкции).

Предикаты в XPath

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

Предикаты всегда заключаются в квадратные скобки, например:

softwareTester [@ name = ”T2 ″]:

Этот пример выберет элемент <softwareTester> с атрибутом, равным T2.

6. Функции XPath

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

1. Функции даты и времени:

  • current-date(). Возвращает текущую дату.
  • current-dateTime(). Возвращает текущую дату и время.
  • hours-from-time(time). Извлекает компонент часов из значения времени.
  • dateTime(date, time). Объединяет указанную дату и время.
  • days-from-duration(dayTimeDuration). Извлекает дневной компонент значения продолжительности дня.
  • timezone-from-dateTime(dateTime). Извлекает компонент часового пояса значения даты и времени.

2. Функции имен:

  • base-uri(). Возвращает значение базового URI контекстного узла.
  • local-name(). Возвращает локальную часть имени контекстного узла.
  • name(node). Возвращает имя узла в виде строки в лексической форме QName.

3. Функции набора узлов:

  • avg(anyAtomicType_sequence). Возвращает среднее значение набора чисел или их продолжительности.
  • count(item_sequence). Подсчитывает количество элементов в последовательности.
  • error(). Вызывает ошибку.
  • id(string_sequence). Находит элементы с заданными значениями атрибута ID.

4. Числовые функции:

  • number(object). Возвращает число на основе переданного ему объекта.
  • floor(aNumber). Возвращает число, равное аргументу, округленное в меньшую сторону до ближайшего целого числа.
  • abs(numeric). Возвращает абсолютное значение заданного числа. Возвращает тот же тип, что и предоставленный аргумент.
  • ceiling(aNumber). Возвращает число, равное аргументу, округленное до ближайшего целого числа.

5. Строковые функции:

  • string(object). Преобразует объект в строку.
  • compare(comparand1, comparand2). Сравнивает две строки с использованием параметров сортировки по умолчанию.
  • lower-case(string). Изменяет символы в строке на нижний регистр.
  • string(item). Возвращает строковое значение аргумента.

Описания всех существующих ныне функций можно найти в спецификации W3 XPath.

7. Примеры использования XPath из практики парсинга информации с сайтов

Ниже приведем наиболее часто встречающиеся участки кода XPath, применяемые разработчиками для парсинга данных с веб-страниц:

  • Для получения текста заголовка h1:
//h1/text()
  • Для получения текста заголовка с классом productName:
//h1[@class="productName"]/text()
  • Для получения значения тега span по классу:
//span[@class="price"]
  • Получаем значение атрибута title у тега button с классом addtocart_button:
//input[@class="addtocart_button"]/@title
  • Если нужен текст ссылки:
//a/text()
  • Получаем url-значение атрибута href необходимой ссылки:
//a/@href
  • Для получения атрибута src рассматриваемого изображения:
//img/@src
  • Для получения изображения сразу за определенным элементом в DOM, ось following:
//h1[@class="produnctName"]//following::div/img/@src
  • Для получения изображения в четвертом div по счету:
//div[4]/img/@src

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

Для закрепления материала приводим несколько полезных ссылок на релевантные видеоролики по теме:

Останні статті

Обучение Power BI – какие онлайн курсы аналитики выбрать

Сегодня мы поговорим о том, как выбрать лучшие курсы Power BI в Украине, особенно для…

13.01.2024

Work.ua назвал самые конкурентные вакансии в IТ за 2023 год

В 2023 году во всех крупнейших регионах конкуренция за вакансию выросла на 5–12%. Не исключением…

08.12.2023

Украинская IT-рекрутерка создала бесплатный трекер поиска работы

Unicorn Hunter/Talent Manager Лина Калиш создала бесплатный трекер поиска работы в Notion, систематизирующий все этапы…

07.12.2023

Mate academy отправит работников в 10-дневный оплачиваемый отпуск

Edtech-стартап Mate academy принял решение отправить своих работников в десятидневный отпуск – с 25 декабря…

07.12.2023

Переписки, фото, история браузера: киевский программист зарабатывал на шпионаже

Служба безопасности Украины задержала в Киеве 46-летнего программиста, который за деньги устанавливал шпионские программы и…

07.12.2023

Как вырасти до сеньйора? Девелопер создал популярную подборку на Github

IT-специалист Джордан Катлер создал и выложил на Github подборку разнообразных ресурсов, которые помогут достичь уровня…

07.12.2023