Я пытаюсь разобрать канал blogspot с помощью xpath, но он, похоже, не работает со всем, что я пытаюсь. Я не уверен, что это из-за пространств имен или что, но я надеялся, что кто-то сможет мне помочь. Вот код:
$xml = simplexml_load_file('http://feeds.feedburner.com/blogspot/MKuf'); $next = $xml->xpath("//link[@rel='next']"); print_r($next);
Это просто возвращает пустой массив, и этого не должно быть. Я попробовал это сделать только ссылку или просто запись, и он все равно возвращается пустым. Единственный, с которым я могу работать, это *. Любая помощь приветствуется.
Как уже сказано в комментарии к вашему вопросу, у документа есть пространство имен по умолчанию, которое вы должны зарегистрировать, прежде чем вы сможете запросить его с помощью XPath.
Поскольку связанный дубликат показывает только, как это сделать с DOM, я добавлю пример SimpleXml
$feed = simplexml_load_file('http://feeds.feedburner.com/blogspot/MKuf'); $feed->registerXPathNamespace('f', 'http://www.w3.org/2005/Atom'); foreach ($feed->xpath('//f:link[@rel="next"]') as $link) { var_dump($link); }
Ручная страница: http://de.php.net/manual/de/simplexmlelement.registerxpathnamespace.php
Демо-версия
Как сказал Гордон, вам нужно зарегистрировать пространство имен по умолчанию для XML-документа, например:
$xml->registerXPathNamespace('default', 'http://www.w3.org/2005/Atom');
И затем используйте префикс по default
для обозначения обычных элементов:
$next = $xml->xpath("//default:link[@rel='next']");
Более новые версии могут позволить вам определить пространство имен по умолчанию ( ''
). См. http://www.qc4blog.com/?p=281 для получения дополнительной информации.