Примеры работы с xPath

Если Вы читаете данную статью, то наверное уже слышали про язык запросов xPath. А если все-таки не слышали, то xPath — это язык запросов к элементам XML-документа (стандарт консорциума W3C). С помощью указанного языка запросов можно легко реализовать навигацию по DOM в XML. Проще говоря, xPath использует более компактный синтаксис, который отличается от принятого в XML.

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

Кстати, если Вы еще не поняли или не знали, то можно работать с HTML-документом как с объектом DOM. Например, недавно я писал парсер для своих нужд, который собирал некоторую информацию с сайта, далее ее сохранял в текстовые файлы.

Примечание. В PHP от версии 5 содержится класс DOMXPath (поддержка xPath 1.0), в котором как раз реализована работа с DOM.

Итак, перейдем к разбору примеров работы с xPath.

Это наши тестовые данные XML-документа.

<magazine>
  <book>
    <title>Learning PHP, MySQL and JavaScript With jQuery, CSS and HTML5</title>
    <author>Робин Никсон</author>
    <price>1158 руб.</price>
    <content>
      <rating>4.3</rating>
      <description>The fully revised, updated and extended 4th edition of the hugely popular web development book - includes CSS, HTML5, jQuery and the mysqli extension.</description>
    </content>
  </book>
  <journal>
    <title>PHP World</title>
    <author>Anton Bekon</author>
    <price>412 руб.</price>
  </journal>
  <book>
    <title>PHP. Быстрый старт</title>
    <author>Каллум Хопкинс</author>
    <price>348 руб.</price>
    <content>
      <rating>3.5</rating>
      <description>Все, что нужно знать о PHP в одной книге!</description>
    </content>
  </book>
  <book>
    <title>Modern PHP: New Features and Good Practices</title>
    <author>Джош Локхарт</author>
    <price>834 руб.</price>
    <content>
      <rating>5</rating>
      <description>PHP is experiencing a renaissance, though it may be difficult to tell with all of the outdated PHP tutorials online.</description>
    </content>
  </book>
</magazine>

Запрос: //book

Результат:

<book>
    <title>Learning PHP, MySQL and JavaScript With jQuery, CSS and HTML5</title>
    <author>Робин Никсон</author>
    <price>1158 руб.</price>
    <content>
      <rating>4.3</rating>
      <description>The fully revised, updated and extended 4th edition of the hugely popular web development book : includes CSS, HTML5, jQuery and the mysqli extension.</description>
    </content>
  </book>
<book>
    <title>PHP. Быстрый старт</title>
    <author>Каллум Хопкинс</author>
    <price>348 руб.</price>
    <content>
      <rating>3.5</rating>
      <description>Все, что нужно знать о PHP в одной книге!</description>
    </content>
  </book>
<book>
    <title>Modern PHP: New Features and Good Practices</title>
    <author>Джош Локхарт</author>
    <price>834 руб.</price>
    <content>
      <rating>5</rating>
      <description>PHP is experiencing a renaissance, though it may be difficult to tell with all of the outdated PHP tutorials online.</description>
    </content>
</book>

Здесь получены все узлы с именем <book>.

Запрос: //book[2]

<book>
    <title>PHP. Быстрый старт</title>
    <author>Каллум Хопкинс</author>
    <price>348 руб.</price>
    <content>
      <rating>3.5</rating>
      <description>Все, что нужно знать о PHP в одной книге!</description>
    </content>
</book>

Здесь получен только второй узел <book>.

Если выполнить запрос как //book[last()], то вы получите только последний узел. В данном случае такой запрос аналогичен //book[3].

Запрос: //title/..

Результат:

<book>
    <title>Learning PHP, MySQL and JavaScript With jQuery, CSS and HTML5</title>
    <author>Робин Никсон</author>
    <price>1158 руб.</price>
    <content>
      <rating>4.3</rating>
      <description>The fully revised, updated and extended 4th edition of the hugely popular web development book : includes CSS, HTML5, jQuery and the mysqli extension.</description>
    </content>
  </book>
<journal>
    <title>PHP World</title>
    <author>Anton Bekon</author>
    <price>412 руб.</price>
  </journal>
<book>
    <title>PHP. Быстрый старт</title>
    <author>Каллум Хопкинс</author>
    <price>348 руб.</price>
    <content>
      <rating>3.5</rating>
      <description>Все, что нужно знать о PHP в одной книге!</description>
    </content>
  </book>
<book>
    <title>Modern PHP: New Features and Good Practices</title>
    <author>Джош Локхарт</author>
    <price>834 руб.</price>
    <content>
      <rating>5</rating>
      <description>PHP is experiencing a renaissance, though it may be difficult to tell with all of the outdated PHP tutorials online.</description>
    </content>
</book>

При данном запросе мы получаем родителя элемента <title>, т.е. все узлы с именем <book> и <journal>.

Запрос: //book/author[text() = «Каллум Хопкинс»]

Результат:

<author>Каллум Хопкинс</author>

Возвращается элемент <author> с содержимым «Каллум Хопкинс».

Запрос: //book/content/rating[text()<5]

Результат:

<rating>4.3</rating>
<rating>3.5</rating>

Как видите, были возвращены все элементы <rating> со значением меньше 5.

Запрос: //book[position()<3]

Результат:

<book>
    <title>Learning PHP, MySQL and JavaScript With jQuery, CSS and HTML5</title>
    <author>Робин Никсон</author>
    <price>1158 руб.</price>
    <content>
      <rating>4.3</rating>
      <description>The fully revised, updated and extended 4th edition of the hugely popular web development book : includes CSS, HTML5, jQuery and the mysqli extension.</description>
    </content>
  </book>
<book>
    <title>PHP. Быстрый старт</title>
    <author>Каллум Хопкинс</author>
    <price>348 руб.</price>
    <content>
      <rating>3.5</rating>
      <description>Все, что нужно знать о PHP в одной книге!</description>
    </content>
</book>

Здесь происходит выбор первых двух узлов <book>.

Запрос: magazine/*/price

Результат:

<price>1158 руб.</price>
<price>412 руб.</price>
<price>348 руб.</price>
<price>834 руб.</price>

Таким образом мы вернули все элементы <price>, который были найдены в корневом узле <magazine>.

Примеров можно написать огромное множество. Я лишь показал часть возможностей по работе с xPath. В самом конце статьи прикрепляю полезные ссылки на ресурсы от Microsoft.

И наконец, для тех кто только начинает использовать xPath в своей работе будет не менее полезным Шпаргалка по xPath.

Полезные ссылки

 

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Добавить комментарий

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: