ОС

Сокращенный синтаксис XPath. Примеры xpath-запросов к html Получить значение определенного span по классу

Сокращенный синтаксис XPath. Примеры xpath-запросов к html Получить значение определенного span по классу

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

Операции сравнения

  • < - логическое «меньше»
  • > - логическое «больше»
  • <= - логическое «меньше либо равно»
  • >= - логическое «больше либо равно»
ul/li , ul/li - элементы списка начиная с 3го номера и наоборот.

Самостоятельно

Попробуйте получить:
- четные 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 использует выражения пути для выбора узлов в документе XML или набор узлов. По узлу вдоль пути (путь) или стадии (шагов) к выбранному.

экземпляра XML-документы

Мы будем использовать этот XML-документ в приведенных ниже примерах.


Harry Potter
29.99


Learning XML
39.95

Выберите узел

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

В приведенной ниже таблице мы приводим некоторые из путей выражения и результат выражения:

выражение Путь результат
книжный магазин Выберите все дочерние узлы книжного элемента.
/ Книжный магазин

Выберите корневой элемент книжный магазин.

Примечание: Если путь начинается с косой черты (/), путь всегда представитель абсолютного пути к элементу!

книжный магазин / книга Выберите вложенные элементы, принадлежащие в книжном магазине все книжные элементы.
// Книга Выделить все книги подэлементы, независимо от их положения в документе.
книжный магазин // книга Выбирает все книжные элементы, которые не принадлежат к потомкам книжного магазина элемента, независимо от того, в каком положении они находятся в и под книжный магазин.
// @ Lang Выберите все свойства названных Ланг.

Предикат (Предикаты)

Предикат используется, чтобы найти конкретный узел или узел, который содержит значение, указанное.

Предикат вкладывается в квадратные скобки.

В приведенной ниже таблице, мы перечислили некоторые выражения пути с предикатами и результат выражения:

выражение Путь результат
/ Книжный магазин / книга Выберите вложенные элементы, принадлежащие первой книги книжный элемент.
/ Книжный магазин / книга [последняя ()] Выберите вложенные элементы, принадлежащие книжный последний книжный элемент.
/ Книжный магазин / книга [последняя () - 1] Выберите вложенные элементы, относящиеся к взаимным книжного магазина второго книжного элемента.
/ Книжный магазин / книга [положение () <3] Выберите первые две книги элементы книжного элемента, принадлежащего к подэлементов.
// Название [@lang] Выбрать все атрибут с именем Ланг имеет заголовок элемента.
// Заголовок [@ LANG = "анг"] Выделите все названия элементов, и эти элементы имеют значение атрибута англ яз.
/bookstore/book Выделить все книжные элементы книжного элемента, а значение ценового элемента, который должен быть больше, чем 35.00.
/bookstore/book/title Выберите все элементы заголовка книги элементов книжного элемента, и в котором значение ценового элемента должно быть больше, чем 35.00.

Выберите неизвестные узлы

XPath групповые символы могут быть использованы для выбора неизвестных элементов XML.

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

Выберите несколько путей

Используя выражение пути "|" оператора, вы можете выбрать несколько путей.

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

Сокращенный синтаксис 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 возвращает детей Контекстного узла, у которых есть дети с текстом, равным «Venus»;

PLANET[@UNITS="days"] возвращает всех детей Контекстного узла, у которых есть атрибут UNITS со значением « days »;

PLANET[@UNITS="days"] возвращает шестого ребенка Контекстного узла, только если у этого ребенка есть атрибут UNITS со значением «days». Можно также написать PLANET[@UNITS="days"] ;

PLANET[@COLOR and @UNITS] возвращает всех детей Контекстного узла, у которых есть атрибут COLOR и атрибут UNITS ;

" //PLANET " выбирает все элементы Значение которых отлично от значения любого предшествующего элемента

* выбирает любой элемент , который является первым ребенком своего родителя;

*[@UNITS] выбирает первых пятерых детей контекстного узла, у которых есть атрибут UNITS .

Из книги Обработка баз данных на Visual Basic®.NET автора Мак-Манус Джеффри П

Из книги Программирование на языке Ruby [Идеология языка, теория и практика применения] автора Фултон Хэл

Из книги Справочник по PHP автора

Из книги XSLT автора Хольцнер Стивен

Сокращенный синтаксис Для образцов существует два правила сокращения осей: child::childname может быть сокращено как childname; attribute::childname может быть сокращено как @childname.В следующем списке перечислен ряд примеров образцов с сокращенным синтаксисом; в конце главы вы увидите

Из книги Технология XSLT автора Валиков Алексей Николаевич

Сокращенный синтаксис предикатов Выражения предикатов можно сокращать, опуская "position()=". Например, становится , становится и т.д. С использованием сокращенного синтаксиса применять выражения XPath в предикатах становится существенно проще. Вот ряд

Из книги C++. Сборник рецептов автора Диггинс Кристофер

Из книги автора

Числа XPath В XPath числа хранятся в формате чисел с плавающей точкой двойной точности. В соответствии с формальным определением, числа XPath должны храниться в формате 64-разрядных чисел с плавающей точкой двойной точности IEEE 754, и все числа хранятся как числа с плавающей точкой

Из книги автора

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

Из книги автора

Проверка выражений XPath В пакет Xalan входит удобная программа-пример, ApplyXPath.java, позволяющая применить выражение XPath к документу и посмотреть на результат, что очень помогает при тестировании. Для запуска этого примера вам нужно будет скомпилировать ApplyXPath.java в ApplyXPath.class при

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

Пример XML документа

Для демонстрации синтаксиса XPath будет использоваться следующий XML документ:

Напоминание Отправить письмо! Re: Напоминание Письмо отправлено

Выбор узлов

Чтобы выбрать узлы в XML документе, XPath использует выражения пути. Узел выбирается следуя по заданному пути. Наиболее полезные выражения пути:

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

Выражение XPath Результат
messages Выбирает все узлы с именем "messages"
/messages Выбирает корневой элемент сообщений
Примечание : Если путь начинается с косой черты (/), то он всегда представляет абсолютный путь к элементу!
messages/note Выбирает все элементы note, являющиеся потомками элемента messages
//note Выбирает все элементы note независимо от того, где в документе они находятся
messages//note Выбирает все элементы note, являющиеся потомками элемента messages независимо от того, где они находятся от элемента messages
//@date Выбирает все атрибуты с именем date

Предикаты

Предикаты позволяют найти конкретный узел или узел с конкретным значением.

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

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

Выражение XPath Результат
/messages/note Выбирает первый элемент note, который является прямым потомком элемента messages.
Примечание : В IE 5,6,7,8,9 первым узлом будет , однако согласно W3C это должен быть . Чтобы решить эту проблему в IE, нужно установить опцию SelectionLanguage в значение XPath.
В JavaScript: xml.setProperty("SelectionLanguage","XPath");
/messages/note Выбирает последний элемент note, который является прямым потомком элемента messages.
/messages/note Выбирает предпоследний элемент note, который является прямым потомком элемента messages.
/messages/note Выбирает все элементы heading, у которых есть атрибут date
//heading[@date="10/01/2008"] Выбирает все элементы heading, у которых есть атрибут date со значением "10/01/2008"

Выбор неизвестных заранее узлов

Чтобы найти неизвестные заранее узлы XML документа, XPath позволяет использовать специальные символы.

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

Выбор нескольких путей

Использование оператора | в выражении XPath позволяет делать выбор по нескольким путям.

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