Библиотеки PHP XML не возвращают результаты XPath - PullRequest
1 голос
/ 15 февраля 2011

Я пытаюсь использовать PHP и XPath для захвата всех узлов категории с элементом ID 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 «// *», возвращая все узлы в документе.

Спасибо!

1 Ответ

5 голосов
/ 15 февраля 2011

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

Ваш 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) без префикса пространства имен всегда соответствуют только целям в пространстве без имен.

...