Хорошая сводка по 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>