Аргерих Л. О языке РНР. Часть 5. Страница 24


Хорошая сводка по XPath есть на http://www.zvon.org/HTMLonly/XPathTu-">http://www.zvon.org/HTMLonly/XPathTu- torial/General/examples.html.

Лучше всего проверять выражения XPath с помощью XPath Tester. XPath Tester написан на Java и может быть получен как приложение open source у FiveSight на http://www.fivesight.com/downloads/XPathtester.asp">http://www.fivesight.com/downloads/XPathtester.asp. Для запуска XPath Tester требуется Java 2. С помощью этого приложения можно загрузить доку­ мент XML и, применяя к документу выражения XPath, посмотреть, что они возвращают.

Чтение XML с помощью DOM

Посмотрим теперь, как прочесть файл XML и послать HTML в броузер. Учи­тывая мощь XPath, можно представить себе, что для этого просто потребует­ся выделить все узлы и отправить их броузеру.

Вот код, который выводит файл XML в виде HTML. Сначала создаем новый объект XML с именем $doc. Затем создаем новый контекст, чтобы с помощью XPath ссылаться на узлы в дереве DOM:

<html> <head>

<title>D0M Travel Packages</title> </head>

<body>

<h1>Travel Packages</h1>

<table> <?php

fdoc = domxml_open_file("travel.xml"); ^context = xpath_new_context($doc);

Получим корневой объект:

$root = $doc->document_element();

Создадим переменную $ехрг, которая будет хранить команды XPath. Проще вносить изменения здесь, чем в команде xpath_eval(). Команда XPath //* найдет все дочерние узлы для корневого узла:

$ехрг =

Функция xpath_eval() выполняет команду XPath с контекстом документа. Она возвращает объект, содержащий массив найденных узлов, если синтак­сис XPath верен и функция находит результат, либо false, если синтаксис не верен или функция не возвращает результат. Таким образом, можно помес­тить xpath_eval() в условный оператор. Если есть узлы, которые соответству­ют команде XPath, то они возвращаются и записываются в StmpArr&y. Ключ StmpArray соответствует имени узла, а значение массива - содержимому узла. Массив можно просмотреть в цикле и вывести XML в виде HTML:

if (Spath = xpath_eval($context„ Sexpr)) { $tmpArray = $path->nodeset; while (list() = each($tmpArray)) {

echo("<trxtd>"); echo($tmpArray[Ji]->name); echo("</td><td>"); echo($tmpArray[$i]->content); echo ("</td></t r>\n");

}

} else {

echo("expression: $expr, is invalid\n");

}

?>

</table> </body> </html>