time

Серфим по XHTML/XML с помощью XPath и PHP

php_xpath.png Для разбора (парсинга) файла с XHTML/XML можно использовать regexp, но результат получится не быстрым и не надежным, т.к. структура документа может минется и для составления хорошего regexp’a придется поломать голову. И тут на выручку приходит XPath, который позволяет легко выбирать из XHTML/XML значения внутри тегов, атрибутов, составляя запросы. Метод чем-то похож на роботу с записями в БД.

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

Пример ниже показывает обращение к вымышленной странице, на которой есть таблицей с семью столбцами. Запрос выбирает текстовое значение шестого столбац из строки, css-класс которой имеет значение status1:

$doc = new DOMDocument();
$doc->loadHtmlFile('path/to/file/or/page');
$xpath = new DOMXPath( $doc );
$cell = $xpath->query("//table/tr[@class='status1']/td")->item(6)->nodeValue;

Если вы с XPath не очень знакомы, а нужно выбрать конкретный элемент с страницы и потом обработать в PHP, то для Firefox есть два расширения:

Дополнительное чтиво:

  1. PHP XPath Tutorial – Advanced XML Part 1
  2. A guide to using XPath with PHP to scrape web pages
  3. Web scraping with PHP and XPath
  4. Примеры по DOMDocument и DOMXPath
  5. Хорошее описание XPath

Наткнулся на библиотеку FluentDOM предоставляет интерфейс для работы с DOMDocument, сам способ роботы с документом похож на аналогичный из jQuery.

Вот простой пример с сайта разработчика:

require_once('../FluentDOM.php');
echo FluentDOM($xml)
->node(
FluentDOM($samples)
->find('//b[@id = "first"]')
->removeAttr('id')
->addClass('imported')
)
->replaceAll('//p');

Что сказать? Удобно, вроде многофункционален, честно признаться пока сам не пробовал, но пример многообещающий :)

blog comments powered by Disqus