XPath примеры - шпаргалка для разбора страниц. Сокращенный синтаксис XPath
Примеры xpath-запросов к html
- Разработка веб-сайтов
Xpath - это язык запросов к элементам xml или xhtml документа. Также как SQL, xpath является декларативным языком запросов. Чтобы получить интересующие данные, необходимо всего лишь создать запрос, описывающий эти данные. Всю «черную» работу за вас выполнит интерпретатор языка xpath.
Очень удобно, не правда ли? Давайте посмотри какие возможности предлагает xpath для доступа к узлам веб-страниц.
Создание запроса к узлам веб-страниц
Предлагаю вашему вниманию небольшую лабораторную работу, в ходе которой я продемонстрирую создание xpath запросов к веб-странице. Вы сможете повторить приведенные мной запросы и, самое главное, попробуете выполнить свои. Я надеюсь, что благодаря этому статья будет одинаково интересна новичкам и программистам знакомым с xpath по xml.Для лабораторной нам понадобятся:
- веб-страница xhtml;
- браузер Mozilla Firefox с дополнениями;
- firebug ;
- firePath ;
(вы можете использовать любой другой браузер с визуальной поддержкой xpath)
- немного времени.
В качестве веб-страницы для проведения эксперимента предлагаю главную страницу сайта консорциума всемирной паутины ("http://w3.org "). Именно эта организация разрабатывает языки xquery(xpath), спецификацию xhtml и многие другие стандарты интернета.
Задача
Получить из xhtml-кода главной страницы w3.org информацию о конференциях консорциума при помощи запросов xpath.Приступим к написанию xpath запросов.
Первый Xpath запрос
Открываем закладку Firepath в FireBug, выделяем с селектором элемент для анализа, нажимаем: Firepath создал xpath запрос к выбранному элементу.Если вы выделили заголовок первого события, то запрос будет таким:
После удаления лишних индексов запрос станет соответствовать всем элементам типа «заголовок».
Firepath подсвечивает элементы, которые соответствуют запросу. Вы можете в реальном времени увидеть, какие узлы документа соответствуют запросу.
Запрос для получения информации о местах проведения конференций:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p
Так мы получим список спонсоров:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p
Синтаксис xpath
Давайте вернемся к созданным запросам и разберемся в том, как они устроены.Рассмотрим подробно первый запрос
В этом запросе я выделил три части для демонстрации возможностей xpath. (Деление на части уловное)
Первая часть
.//
- рекурсивный спуск на ноль или более уровней иерархии от текущего контекста. В нашем случае текущий контекст это корень документа
Вторая часть
*
- любой элемент,
[@id="w3c_home_upcoming_events"]
– предикат, на основе которого осуществляем поиск узла, имеющего атрибут id равным "w3c_home_upcoming_events". Идентификаторы элементов XHTML должны быть уникальны. Поэтому запрос «любой элемент с конкретным ID» должен вернуть единственный искомый нами узел.
Мы можем заменить *
на точное имя узла div
в этом запросе
div[@id="w3c_home_upcoming_events"]
Таким образом, мы спускаемся по дереву документа до нужного нам узла div[@id="w3c_home_upcoming_events"]. Нас абсолютно не волнует, из каких узлов состоит DOM-дерево и сколько уровней иерархии осталось выше.
Третья часть
/ul/li/div/p/a
–xpath-путь до конкретного элемента. Путь состоит из шагов адресации и условия проверки узлов (ul, li и т.д.). Шаги разделяются символом " /"(косая черта).
Коллекции xpath
Не всегда удается получить доступ к интересующему узлу с помощью предиката или шагов адресации. Очень часто на одном уровне иерархии находится насколько узлов одинакового типа и необходимо выбрать «только первые» или «только вторые» узлы. Для таких случаев предусмотрены коллекции.Коллекции xpath позволяют получить доступ к элементу по его индексу. Индексы соответствуют тому порядку, в котором элементы были представлены в исходном документе. Порядковый номер в коллекциях отсчитывается от единицы.
Исходя из того, что «место проведения» всегда второй параграф после «названия конференции», получаем следующий запрос:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p
Где p – второй элемент в наборе для каждого узла списка /ul/li/div.
Аналогично список спонсоров мы можем получить запросом:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p
Некоторые функции хpath
В хpath существует множество функций для работы с элементами внутри коллекции. Я приведу только некоторые из них.last():
Возвращает последний элемент коллекции.
Запрос ul/li/div/p - возвратит последние параграфы для каждого узла списка «ul».
Функция first() не предусмотрена. Для доступа к первому элементу используйте индекс «1».
text():
Возвращает тестовое содержание элемента.
.//a – получаем все ссылки с текстом «Archive».
position() и mod:
position() - возвращает позицию элемента в множестве.
mod - остаток от деления.
Комбинацией данных функций можем получить:
- не четные элементы ul/li
- четные элементы: ul/li
Операции сравнения
- < - логическое «меньше»
- > - логическое «больше»
- <= - логическое «меньше либо равно»
- >= - логическое «больше либо равно»
Самостоятельно
Попробуйте получить:- четные URL ссылки из левого меню «Standards»;
- заголовки всех новостей, кроме первой с главной страницы w3c.org.
Xpath в PHP5
$dom = new DomDocument(); $dom->loadHTML($HTMLCode); $xpath = new DomXPath($dom); $_res = $xpath->query(".//*[@id="w3c_home_upcoming_events"]/ul/li/div/p/a"); foreach($_res => $obj) { echo "URL: ".$obj->getAttribute("href"); echo $obj->nodeValue; }В заключение
На простом примере мы увидели возможности xpath для доступа к узлам веб-страниц.Xpath является отраслевым стандартом для доступа к элементам xml и xhtml, xslt преобразований.
Вы можете применять его для парсинга любой html-страницы. В случае если исходный html-код содержит значительные ошибки в разметке пропустите его через
Сокращенный синтаксис XPath
Сокращения синтаксиса XPath могут быть весьма удобными. Ниже приведены правила:
Self::node() может быть сокращено как. ;
Parent::node() может быть сокращено как.. ;
Child::childname может быть сокращено как childname ;
Attribute::childname может быть сокращено как @childname ;
/descendant-or-self::node()/ может быть сокращено как // .
Например, путь расположения.//PLANET - сокращение для self::node()/descendant-or-self::node()/child::PLANET . Можно также сократить выражение предиката как , как и т.д. Работать с путями расположения XPath при помощи сокращенного синтаксиса значительно проще. В следующем списке перечислен ряд примеров путей расположения с использованием сокращенного синтаксиса:
PLANET возвращает дочерние элементы
* возвращает все дочерние элементы контекстного узла;
Text() возвращает все дочерние текстовые узлы контекстного узла;
@UNITS возвращает атрибут UNITS контекстного узла;
@* возвращает все атрибуты контекстного узла;
PLANET возвращает третьего ребенка
PLANET возвращает последнего ребенка
*/PLANET возвращает всех внуков
/PLANETS/PLANET/NAME возвращает второй элемент //PLANET возвращает всех потомков PLANETS//PLANET возвращает элементы-потомки //PLANET/NAME возвращает все элементы Возвращает сам контекстный узел; .//PLANET возвращает элементы-потомки Возвращает родителя контекстного узла; ../@UNITS возвращает атрибут UNITS родителя контекстного узла; .//.. возвращает всех родителей потомка контекстного узла и родителя контекстного узла; PLANET возвращает детей PLANET возвращает детей PLANET[@UNITS="days"] возвращает всех детей PLANET[@UNITS="days"] возвращает шестого ребенка PLANET[@COLOR and @UNITS] возвращает всех детей " //PLANET " выбирает все элементы * выбирает любой элемент *[@UNITS] выбирает первых пятерых детей контекстного узла, у которых есть атрибут UNITS . Сокращенный синтаксис
Для образцов существует два правила сокращения осей: child::childname может быть сокращено как childname; attribute::childname может быть сокращено как @childname.В следующем списке перечислен ряд примеров образцов с сокращенным синтаксисом; в конце главы вы увидите Сокращенный синтаксис предикатов
Выражения предикатов можно сокращать, опуская "position()=". Например, становится , становится и т.д. С использованием сокращенного синтаксиса применять выражения XPath в предикатах становится существенно проще. Вот ряд Числа XPath
В XPath числа хранятся в формате чисел с плавающей точкой двойной точности. В соответствии с формальным определением, числа XPath должны храниться в формате 64-разрядных чисел с плавающей точкой двойной точности IEEE 754, и все числа хранятся как числа с плавающей точкой Применение осей XPath
К этому моменту мы рассмотрели три части шагов расположения - ось, условие узла и предикат. Вы должны быть знакомы с этими элементами по проделанной нами работе с образцами выбора, но обратите внимание на ось в предыдущем примере - preceding-sibling. До сих пор Проверка выражений XPath
В пакет Xalan входит удобная программа-пример, ApplyXPath.java, позволяющая применить выражение XPath к документу и посмотреть на результат, что очень помогает при тестировании. Для запуска этого примера вам нужно будет скомпилировать ApplyXPath.java в ApplyXPath.class при Сегодня мы плотно рассмотрим тему использования XPath вместе с PHP. Вы увидите на примерах, как XPath значительно сокращает количество кода. Рассмотрим использование запросов и функций в XPath. В начале, предоставлю вам два типа документов: DTD и XML, на примере которых мы рассмотрим функционирование PHP DOM XPath. Вот как они выглядят:
Простой синтаксис XPath позволяет обращаться к элементам XML документа. Наиболее простым способом, можно прописать путь к желаемому элементу. Используя XML документ, поданный выше, следующий XPath запрос возвратит коллекцию текущих элементов, находящихся в элементе book: //library/book
Вот так! Два слеша впереди определяют корневой элемент документа, а один слеш производит переход к дочернему элементу book. Это просто и быстро, не так ли? Но что, если вы хотите выбрать определенный элемент book из множества? Давайте предположим, что вам нужны книги «Определенного автора». XPath запрос для этого будет следующим: //library/book/author/..
Вы можете использовать text()
в квадратных скобках для сравнения значения узла. Также «/..»
означает, что мы хотим использовать родительский элемент (т. е. возвращаемся на один узел выше). XPath запросы осуществляются с помощью одной или двух функций: query()
и evaluate()
. Обе формируют запрос, но разница в возвращаемом результате. query() всегда будет возвращать DOMNodeList
, в отличии evaluate()
будет возвращать текстовый результат, если это возможно. Для примера, если ваш XPath запрос будет возвращать количество книг написанных определенным автором, тогда query() возвратит пустой DOMNodeList, evaluate() просто возвратит число, вы можете использовать это непосредственно для получения данных из узла. Давайте рассмотрим простой пример, который будет возвращать количество книг написанных конкретным автором. Первый метод мы рассмотрим так, как мы всегда делаем, без использования XPath. Сейчас вы поймете, как это делается без XPath и насколько это проще делать с XPath.
domDocument->getElementsByTagName("author");
foreach ($elements as $element) {
if ($element->nodeValue == $author) {
$total++;
}
}
return $number;
}
Следующий метод возвращает такой же результат, но используется XPath для выбора тех книг, которые написанные определенным автором.
domDocument);
$result = $xpath->query($query);
return $result->length;
}
Заметьте, нам не нужно повторно проверять значение каждого элемента, чтобы определить, каким автором написана каждая книга. Но мы можем более упростить код, используя XPath функцию count()
, чтобы подсчитать содержимое элементов этого пути.
domDocument);
return $xpath->evaluate($query);
}
Мы можем получить информацию, которую нам нужно, с помощью одной строки XPath запроса. Нет необходимости создавать множество PHP фильтров. Это наиболее простой и быстрый способ написать этот функционал! Заметьте, что evaluate() использовался в последнем примере. Это потому что функция count() возвращает текстовый результат. Используя query(), возвратиться DOMNodeList, но он будет пустым. XPath стоит использовать, не только потому что это делает ваш PHP код проще, это также дает преимущество в скорости выполнения кода. Я заметил, что первая версия была на 30% быстрее в среднем, по сравнению со второй. Но третья на 10% быстрее первой. Конечно же, это зависит от вашего сервера и запросов, которые используете. Использование XPath в его чистом виде, дает величайшие результаты в скорости и простоте написания кода. Вот несколько функций, которые могут использоваться с XPath. Также вы найдете множество ресурсов, которые детально рассматривают каждую доступную функцию. Если вам нужно вычислять DOMNodeList или сравнивать nodeValue (значение узла), можно найти подходящую XPath функцию, которая исключит использование лишнего PHP кода. Вы уже это знаете на примере count() функции. Давайте воспользуемся функцией id(), для получение названий книг с заданными ISBN. Для этого нужно использовать следующее XPath выражение: id("isbn1234 isbn1235")/title
Заметьте, значения, которые вы ищете не стоит заключать в скобки, только разделите их пробелами. Также не вздумайте влепить запятую:
domDocument);
$result = $xpath->query($query);
$books = array();
foreach ($result as $node) {
$book = array("title" => $booknode->nodeValue);
$books = $book;
}
return $books;
}
Обработка сложных функций в XPath невероятно проста. Иногда вам необходимо будет больше функциональности, которую не могут предоставить стандартные функции XPath. К счастью, PHP DOM позволяет взаимодействовать собственным функциям PHP с XPath запросами. Давайте рассмотрим пример, который возвращает количество слов в названии книги. В этой простейшей функции, мы напишем следующее:
domDocument);
$result = $xpath->query($query);
$title = $result->item(0)->getElementsByTagName("title")
->item(0)->nodeValue;
return str_word_count($title);
}
Но, мы также можем включить функцию str_word_count() непосредственно в XPath запрос. Это можно сделать с помощью нескольких шагов. Прежде всего, нам нужно зарегистрировать namespase с XPath объектом. PHP функции в XPath запросах вызываются с помощью строки «php:functionString», после чего прописывается имя желаемой функции. Также, namespace более подробно рассматривается на http://php.net/xpath. Другие значения namespace будут выдавать ошибку. После этого нам нужно вызвать registerPHPFunctions(). Эта функция сообщает PHP, что когда идет обращение через namespace «php:», этот вызов будет обрабатывать именно PHP. Примерный синтаксис вызова функций будет следующим: php:functionString("nameoffunction", arg, arg...)
Давайте совместим все это вместе в следующем примере функции getNumberOfWords():
domDocument);
//регистрируем php namespace
$xpath->registerNamespace("php", "http://php.net/xpath");
//теперь php функции могут вызываться в xpath запросах
$xpath->registerPHPFunctions();
$query = "php:functionString("str_word_count",(//library/book[@isbn = "$isbn"]/title))";
return $xpath->evaluate($query);
}
Заметьте, что вам не нужно вызывать XPath функцию text() чтобы получить текст узла. Метод registerPHPFunctions() делает это автоматизированным. Хотя, следующий пример строки кода также будет валидным: php:functionString("str_word_count",(//library/book[@isbn = "$isbn"]/title))
Регистрирование PHP функций не ограничено для функций, которые включены в PHP. Вы можете определить свои собственные функции и использовать их внутри XPath. Единственное отличие в том, что придется использовать «php:function» вместо «php:functionString». Давайте напишем функцию, которая будет за пределами класса, для демонстрации базовой функциональности. Функция, которую мы будем использовать, возвращает книги автора «George Orwell». Она должна возвращать true для каждого узла, который вы хотите включить в запрос.
nodeValue == "George Orwell";
}
Аргумент, который передается в функцию, является массивом DOM элементов. Эта функция проходит по массиву и определяет нужные элементы, после чего включает их в DOMNodeList. В этом примере, испытываемый узел был /book, также мы использовали /author для определения нужных элементов. Теперь мы можем создать функцию getGeorgeOrwellBooks():
domDocument);
$xpath->registerNamespace("php", "http://php.net/xpath");
$xpath->registerPHPFunctions();
$query = "//library/book1";
$result = $xpath->query($query);
$books = array();
foreach($result as $node) {
$books = $node->getElementsByTagName("title")
->item(0)->nodeValue;
}
return $books;
}
Если функция compare() статическая, тогда вам нужно внести поправку в XPath запрос: //library/book
Говоря по правде, вся эта функциональность могла быть реализована с помощью чистого XPath кода. Но, пример показывает, как можно расширять XPath запросы и делать их более комплексными. XPath
- это отличный способ сократить количество кода и повысить его обработку, при работе с XML. Дополнительная функциональность PHP DOM позволяет вам расширить XPath функции. Это реально полезная штука, если вы будете ее использовать и углубляться в специфику, вам придется меньше и меньше писать кода. Примеры использования xpath из практики парсинга информации с сайтов. Приведены участки кода xpath. Получить текст заголовока h1
//h1/text()
Получить текст заголовока с классом produnctName
//h1[@class="produnctName"]/text()
Получить значение определенного span по классу
//span[@class="price"]
Получить значение атрибута title у кнопки с классом addtocart_button
//input[@class="addtocart_button"]/@title
//a/text()
//a/@href
Изображение src
//img/@src
Изображение сразу за определенным элементом в DOM, ось following
//h1[@class="produnctName"]//following::div/img/@src
Изображение в 4 div по счету
//div/img/@src
XPath
(XML Path Language) — язык запросов к элементам XML-документа. Разработан для организации доступа к частям документа XML в файлах трансформации XSLT и является стандартом консорциума W3C. XPath призван реализовать навигацию по DOM в XML. XML имеет древовидную структуру. У элемента дерева всегда существуют потомки и предки, кроме корневого элемента, у которого предков нет, а также тупиковых элементов (листьев дерева), у которых нет потомков. На каждом шаге пути отбираются элементы, соответствующие условиям отбора на этом шаге, и в результате обращения по пути к документу получается множество элементов, удовлетворяющих данному пути. Возвращает все узлы. Вместо этой функции часто используют заменитель "*", но, в отличие от звездочки, функция node() возвращает и текстовые
узлы. Возвращает набор текстовых узлов; Возвращает множество из одного элемента, который является текущим. Если мы делаем обработку множества с условиями, то единственным способом дотянуться из этого условия до текущего элемента будет данная функция. Возвращает позицию элемента в множестве. Корректно работает только в цикле Возвращает номер последнего элемента в множестве. Корректно работает только в цикле Возвращает количество элементов в node-set. Возвращает полное имя первого тега в множестве. Возвращает имя первого тега в множестве, без пространства имён. Находит элемент с уникальным идентификатором Оси — это база
языка XPath. Для некоторых осей существуют сокращённые обозначения. XPath используется для навигации по элементам и атрибутам XML-документа. XPath является одним из основных элементов в стандарте XSLT консорциума W3C. Выражения XPath
XPath использует выражения пути для выбора отдельных узлов или набора узлов в документе XML. Эти выражения очень похожи на выражения, которые вы видите, когда работаете с традиционной файловой системой компьютера. Стандартные функции XPath
XPath включает в себя более 100 встроенных функций. Есть функции для строковых и числовых значений, даты и времени, сравнения узлов и манипулирования QName, управления последовательностями, булевых значений, и многое другое. XPath используется в XSLT
XPath является одним из основных элементов в стандарте XSLT. Без знания XPath вы не будете иметь возможность создавать XSLT-документы. В XPath существует семь видов узлов: элемент, атрибут, текст, пространство имён, инструкции обработки, комментарии и узлы документа. XML-документы обрабатываются в виде деревьев узлов. Верхний элемент дерева называется корневым элементом. Посмотрите на следующий документ XML:
Пример узлов в документе XML выше: Атомарные значения являются узлами, не имеющие детей или родителей. Пример атомарных значений: J. K. Rowling
"en"
Элементы - это атомарные значения или узлы. Каждый элемент и атрибут имеет одного родителя. В следующем примере элемент «книга» (book) является родителем элементов «название» (title), «автор» (author), «год» (year) и «цена» (price):
Узлы элементов могут иметь ноль, один или более потомков. В следующем примере элементы «название», «автор», «год» и «цена» - они все потомки элемента книга:
Это узлы, которые имеют одного и того же родителя. В следующем примере элементы «название», «автор», «год» и «цена» все являются элементами одного уровня:
Родитель узла, родитель родителя узла и т.д. В следующем примере предки элемента «название» (title) - это элементы «книга» (book) и «книжный магазин» (bookstore):
Дети узла, дети детей узла и т.д. В следующем примере потомками элемента «книжный магазин» являются элементы «книга», «название», «автор», «год» и «цена»:
XPath использует выражения пути для выбора узлов или множества узлов в документе XML. Узел можно выбрать, следуя пути или по шагам. Мы будем использовать следующий XML-документ в приведённых ниже примерах.
С помощью выражений XPath для выбора узлов в документе XML можно выбрать узел, следуя пути или шагам. Самые полезные выражения пути перечислены ниже: В приведенной ниже таблице перечислены некоторые пути выражения и результат выполнения выражения: Примечание:
Если путь начинается с косой черты (/), он всегда представляет собой абсолютный путь к элементу! Предикаты используются для поиска специфического узла или узла, который содержит специфическое значение. Предикаты всегда обрамляются квадратными скобками. В приведённой ниже таблице перечислены некоторые выражения пути с предикатами, и результат выражения: Примечание:
В IE 5,6,7,8,9 первый узел имеет индекс , но в соответствии с рекомендациями W3C, это . Для решения этой проблемы в IE, задаётся опция "SelectionLanguage" для XPath: Специальные символы XPath могут использоваться для выбора неизвестных XML узлов. В приведённой ниже таблице мы перечислили некоторые пути выражения и результаты выражений: С помощью оператора | в выражениях XPath вы можете выбрать несколько путей. В таблице ниже перечислены несколько выражений путей и результаты их применения: Мы будем использовать следующий XML документ далее в примере.
Оси определяют наборы узлов, относительно текущего узла. Путь определения местоположения может быть абсолютным или относительным. Абсолютный путь расположения начинается с косой черты (/), а относительный - нет. В обоих случаях путь выборки состоит из одного или нескольких шагов, разделённых косой чертой: Абсолютный путь расположения:
/step/step/...
Относительный путь выборки расположения: Step/step/...
Каждый шаг оценивается по узлам в текущем наборе узлов. Шаг состоит из: Синтаксис шага выборки такой: Axisname::nodetest
имяОси::проверкаУзла[предиктор]
Выражения XPath возвращают как набор узлов, строки, булевы или числовые значения. Ниже представлен список операторов, используемых в выражениях XPath: Давайте рассмотрим базовый синтаксис XPath на нескольких примерах. Мы будем использовать следующий XML документ "books.xml" в примерах ниже:
Используйте XMLHttpRequest для загрузки XML документов, который поддерживается большинством современных браузеров: Var xmlhttp=new XMLHttpRequest()
Код для устаревших браузеров Microsoft (IE 5 и 6): Var xmlhttp=new ActiveXObject("Microsoft.XMLHTTP")
К сожалению, работа с XPath в Internet Explorer и в других браузерах может отличаться. В наших примерах мы будем использовать код, который должен работать в большинстве браузеров. Internet Explorer использует метод "selectNodes()" для выбора узлов XML документа: XmlDoc.selectNodes(xpath);
Firefox, Chrome, Opera и Safari используют метод evaluate() для выбора узлов из XML документа: XmlDoc.evaluate(xpath, xmlDoc, null,
XPathResult.ANY_TYPE, null);
Следующий пример выбирает все узлы заголовков:
/bookstore/book/title
Следующий пример выбирает заголовок первого узла «книга» после элемента «книжный магазин» (bookstore):
/bookstore/book/title
Следующий пример выбирает текст всех узлов «цена» (price):
/bookstore/book/price
Следующий пример выбирает все узлы с ценами выше 35:
/bookstore/book/price
Следующий пример выбирает все узлы заголовков с ценой выше 35:
/bookstore/book/titleОсновные XPath запросы
Код и преимущества скорости XPath
XPath Функции
Использование PHP функций совместно с XPath
В завершение
Функции над множествами узлов
1
Что такое
XPath
2
Терминология
XPath
Узлы
Атомарные значения
Элементы
3
Отношения
узлов
Родитель
Потомки
Элементы одного уровня
Предки
Потомки
4
Синтаксис
XPath
Выбор узлов
Выражение XPath
Результат
bookstore
Выбирает все узлы с именем "bookstore"
/bookstore
Выбирает корневой элемент книжного магазина
bookstore/book
Выбирает все элементы «книга» (book), которые являются потомками элемента «книжный магазин» (bookstore)
//book
Выбирает все элементы «книга» независимо от того, где они находятся в документе
bookstore//book
Выбирает все элементы «книга», которые являются потомком элемента «книжный магазин», независимо от того, где они находятся под элементом «книжный магазин»
//@lang
Выбирает все атрибуты, которые называются "lang"
Предикаты
Выражения XPath
Результат
/bookstore/book
Выбирает первый элемент «книга», который является потомком элемента «книжный магазин».
/bookstore/book
Выбирает последний элемент «книга» (book), который является дочерним элементом элемента «книжный магазин» (bookstore)
/bookstore/book
Выбирает предпоследний элемент «книга», который является дочерним элементом элемента «книжный магазин»
/bookstore/book
Выбор первых двух элементов «книга», которые являются потомками элемента «книжный магазин»
//title[@lang]
Выбирает все элементы «название» (title), которые имеют атрибут с именем "lang"
//title[@lang="en"]
Выбирает все элементы «название», которые имеют атрибут «язык» со значением "en"
/bookstore/book
Выбирает все элементы «книга» после элемента «книжный магазин», которые имеют элемент «цена» со значением больше, чем 35.00
/bookstore/book/title
Выбирает все элементы «название» книги элемента «книжный магазин», которые имеют элемент «цена» со значением больше, чем 35.00
Выбор неизвестных узлов
Выбор нескольких путей
5
Оси
XPath
Название оси
Результат
ancestor
Выбирает всех предков (родителей, прародителей и т.д.) текущего узла
ancestor-or-self
Выбирает всех предков (родителей, прародителей и т.д.) текущего узла и сам текущий узел
attribute
child
descendant
Выбирает всех потомков (детей, внуков и т.д.) текущего узла
descendant-or-self
Выбирает всех потомков (детей, внуков и т.д.) текущего узла и сам текущий узел
following
Выбирает всё в документе после закрытия тэга текущего узла
following-sibling
Выбирает все узлы одного уровня после текущего узла
namespace
Выбирает все узлы в данном пространстве имён (namespace) текущего узла
parent
Выбирает родителя текущего узла
preceding
Выбирает все узлы, которые появляются перед текущим узлом в документе, за исключением предков, узлов атрибутов и узлы пространства имён
preceding-sibling
Выбирает всех братьев и сестёр до текущего узла
self
Выбирает текущий узел
6
Выражения
пути выборки
Пример
Результат
child::book
Выбирает все узлы «книга» (book), которые являются потомками текущего узла
attribute::lang
Выбирает атрибут «язык» (lang) текущего узла
child::*
Выбирает всех потомков текущего узла
attribute::*
Выбирает все атрибуты текущего узла
child::text()
Выбирает все текстовые узлы текущего узла
child::node()
Выбирает всех ближайших потомков текущего узла
descendant::book
Выбирает всех потомков текущего узла
ancestor::book
Выбирает всех предков «книга» (books) текущего узла
ancestor-or-self::book
Выбирает всех предков «книга» (book) текущего узла - и текущий узел, если он также «книга» (book)
child::*/child::price
Выбирает все потомки «цена» (price) через один уровень от текущего узла
7
Операторы
XPath
Оператор
Описание
Пример
|
Вычисляет два набора узлов
//book | //cd
+
Сложение
6 + 4
-
Вычитание
6 - 4
*
Умножение
6 * 4
div
Деление
8 div 4
=
Равенство
price=9.80
!=
Неравенство
price!=9.80
<
Меньше, чем
price<9.80
<=
Меньше или равно
price≤9.80
>
Больше, чем
price>9.80
>=
Больше или равно
price≤9.80
or
Или
price=9.80 or price=9.70
and
И
price>9.00 and price<9.90
mod
Остаток от деления
5 mod 2
8
Примеры
XPath
Загрузка XML документа
Выбор узлов
Выбор всех заглавий
Выбор заголовка первой книги
Выбор всех цен
Выбирает узлы с ценой >35
Выбор узлов заголовков с ценой >35