XML-библиотеки PHP не возвращают результаты XPath

Я пытаюсь использовать PHP и XPath для захвата всех узлов категории с элементом идентификатора 1364 из этого XML: http://education.oracle.co.uk/html/oracle/28US/schedule.xml

Мой код в настоящее время выглядит так:

$schedule = new SimpleXMLElement("schedule.xml", null, true);
$nodes = $schedule->xpath("//category[id=1364]");
if(!$nodes) {
    echo "No xpath results.";
} else {
    echo count($nodes)." results.";
}

XPath не возвращает результатов. Я проверил запрос, используя другие программы запросов XPath, и результат был возвращен.

В приведенном выше коде используется SimpleXML, но у меня возникла точно такая же проблема при использовании DOMDocument. Как в SimpleXML, так и в DOMDocument работает XPath "//*", возвращая все узлы в документе.

Спасибо!


person RusNewman    schedule 15.02.2011    source источник


Ответы (1)


Дикое предположение, это проблема пространства имен

Ваш XML-документ, вероятно, содержит что-то вроде этого

<root xmlns="http://some.uri">
    <category id="1364"/>
</root>

Поскольку <category> находится в пространстве имен по умолчанию, у него нет префикса, но для того, чтобы ваш XPath работал, вам также необходимо привязать это пространство имен к некоторому префиксу, а затем использовать этот префикс в вашем выражении XPath.

$schedule->registerXPathNamespace("ns", "http://some.uri");
$nodes = $schedule->xpath('//ns:category[id=1364]');

Выражения XPath (1.0) без префикса пространства имен всегда соответствуют только целям без пространства имен.

person jasso    schedule 15.02.2011
comment
Точнее: два расширенных имени равны, если они имеют одинаковую локальную часть и либо оба имеют нулевой URI пространства имен, либо оба имеют ненулевые URI пространства имен, которые равны. w3.org/TR/xpath/#data-model - person Flack; 15.02.2011
comment
С XPath, установленным в //ns:category[ns:id=1364], все работает отлично! - person RusNewman; 15.02.2011