Шпаргалка xpath

grigoriev
1753

Ниже указан листин кода, к которому были написаны тестовые xpath запросы.

                   <?xml version="1.0" encoding="windows-1251" ?>
                   <tyresprice>
                           <tyres id="1" store="yes">
                                   <manufacturer>Kumho</manufacturer>
                                   <pattern>31x10.5R15</pattern>
                                   <season>winter</season> 
                                   <price>9270</price>
                           </tyres>
                           <tyres id="2">
                                   <manufacturer>Yokohama</manufacturer>
                                   <pattern>275/55R17</pattern>
                                   <season>winter</season> 
                                   <price>10030</price>
                           </tyres>  
                           <tyres id="3" store="no">
                                   <manufacturer>Nokian</manufacturer>
                                   <pattern>295/40R20</pattern>
                                   <season>summer</season> 
                                   <price>17370</price>
                           </tyres>
                           <tyres id="4" store="yes">
                                   <manufacturer>TOYO</manufacturer>
                                   <pattern>175/65R14</pattern>
                                   <season>summer</season> 
                                   <price>2500</price>
                           </tyres>
                   </tyresprice>
                

Xpath синтаксис

Локаторы xpath

/ Выбирает весь документ
// Выбирает элементы на любой глубине вложенности
* Любой какой угодно элемент
//* Выберет все элементы по отдельности (tyresprice, tyres, manufacturer, pattern, season, price)
/tyresprice/tyres/* или//tyres/* Выберет все элементы из каждого tyres (manufacturer, pattern, season, price)

Оси xpath выборки

self возвращает сам элемент
child возвращает детей элемента
parent возвращает родителя элемента
attribute атрибут элемента
descendant возвращает всех потомков элемента (всех детей и детей детей)
descendant-or-self возвращает всех потомков выбранного элемента и сам элемент
ancestor возвращает всех предков выбранного элемента
ancestor-or-self возвращает всех предков выбранного элемента и сам элемент
following Все элементы со своими детьми которые ниже по коду
following-sibling Все ниже лежащие соседи без своих детей
preceding Все элементы со своими детьми которые выше по коду
preceding-sibling Все выше лежащие соседи без своих детей

Сокращения xpath

tyresprice/child::tyres Аналог tyresprice/tyres вернёт всех детей всех tyres
@ Аналог attribute::
tyresprice/tyres/
attribute::store
Аналог tyresprice/tyres/@store вернёт все значения атрибута store всех tyres
. Аналог self::node()узел выбирает сам себя
.. Аналог parent::node()узел выбирает своего родителя

Предикаты xpath

axis::node-test[predicate] Форма записи
tyresprice/tyres[2] Предикат по положению, вернёт вторую марку шины
tyresprice/tyres[last()] Вернёт последнюю марку шины
tyresprice/tyres/price[.<10000] Вернёт price где цена ниже 10000
tyresprice/tyres/price[.<10000]/../manufacturer Вернёт названия шин цена которых ниже 10000
tyresprice/tyres[price<10000]/manufacturer Аналогичная запись
tyresprice/tyres[@store] Предикат по присутствию, вернёт все шины у которых есть атрибут store

Операции xpath

А and B, A or B Логические и или
tyresprice/tyres[price<10000 and
price>3000 ]/manufacturer
Вернёт шины Kumho
A+B, A-B, A*B,A div B Арифметические
A=B, A!=B, A>B,
A < B, A>=B, A<=B
Сравнение

Функции xpath

sum() Суммирует числовые значения узлов(нодов)
concat(строка, строка, строка*) Склеивание строк
starts-with(строка, строка) Определит есть ли в начале строки искомый кусок
tyresprice/tyres/manufacturer
[starts-with(., 'Kumho')]
Вернёт узел, где в названии есть Kumho
contains(строка, строка) Определяет есть ли в заданой строке искомая строка
substring-before(строка, строка) Возврашает всё из строки что было до аргумента, заданного второй строкой
substring-after(строка, строка) Возврашает всё из строки что было после аргумента, заданного второй строкой
substring(строка, номер, номер) Возвращает кусок строки с заданного номера, до конца заданного номера, если второй номер не задан то до конца строки
string-length(строка) Возвращает количество символов в заданной строке
position() Возвращает позицию в виде числа искомого узла
last() Возвращает позицию в виде числа последнего узла
count() Возвращает количество нодов в выборке

Работа xpath с php


                    $testurl="https://www.какойто адрес сайта";
                        //закачиваем  страницу сайта
                    $testcont=  file_get_contents($testurl);
                        //отключаем показ ошибок 
                    libxml_use_internal_errors(true); 
                        //получаем объект класса DOMDocument
                    $testdom = new DOMDocument();
                        //учтанавливаем нужные настройки
                    $testdom->preserveWhiteSpace = false;
                    $testdom->resolveExternals = false; 
                    $testdom->validateOnParse = false;
                        // распарсиваем HTML документ
                    $testdom->loadHTML($testcont);
                        //получаем объект класса DOMXpath
                    $xpath = new DOMXpath($testdom);
                        //получаем элементы с помощью xpath 
                    $testitems=$xpath->query("//*");
                        //выводим данные в цикле
                    foreach ($testitems as $myitem){
                        ........
                    }

                

Поделиться: