Intereting Posts

Простой xpath вопрос, который сводит меня с ума

ниже – структура фида, которому я смог распечатать контент, используя этот 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>"; ?> 

Solutions Collecting From Web of "Простой xpath вопрос, который сводит меня с ума"

попробуй это:

 $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']