ниже – структура фида, которому я смог распечатать контент, используя этот xpath
$xml->xpath('/rss/channel//item')
структура
<rss><channel><item><pubDate></pubDate><title></title><description></description><link></link><author></author></item></channel></rss>
Однако некоторые из моих файлов следуют этой структуре
<feed xmlns="http://www.w3.org/2005/Atom" .....><entry><published></published><title></title><description></description><link></link><author></author></entry></feed>
и я догадался, что это должно быть xpath, чтобы получить содержание записи
$xml->xpath('/feed//entry')
что-то мне показалось неправильным.
Мой вопрос в том, каков правильный xpath для использования? Я что-то пропустил?
Это код
<?php $feeds = array('http://feeds.feedburner.com/blogspot/wSuKU'); $entries = array(); foreach ($feeds as $feed) { $xml = simplexml_load_file($feed); $entries = array_merge($entries, $xml->xpath('/feed//entry')); } echo "<pre>"; print_r($entries); echo"</pre>"; ?>
попробуй это:
$xml->registerXPathNamespace('f', 'http://www.w3.org/2005/Atom'); $xml->xpath('/f:feed/f:entry');
Если вы хотите, чтобы одно выражение XPath работало при применении к RSS или фиду ATOM, вы можете использовать одно из следующих выражений XPath:
Это самый точный, но и самый многословный:
(/rss/channel/item | /*[local-name()='feed' and namespace-uri()='http://www.w3.org/2005/Atom'] /*[local-name()='entry' and namespace-uri()='http://www.w3.org/2005/Atom'])
Это игнорирует пространство имен элементов ATOM и просто совпадает с их local-name()
:
(/rss/channel/item | /*[local-name()='feed']/*[local-name()='entry'])
Это один из самых простых, но наименее точных и наименее эффективных:
/*//*[local-name()='item' or local-name()='entry']