Простой вопрос xpath, который сводит меня с ума - PullRequest
2 голосов
/ 10 июня 2011

ниже - структура канала, который мне удалось распечатать, используя этот 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 для использования?Я что-то пропустил?

Это код

<code><?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"
";?>

Ответы [ 2 ]

4 голосов
/ 10 июня 2011

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

$xml->registerXPathNamespace('f', 'http://www.w3.org/2005/Atom');
$xml->xpath('/f:feed/f:entry');
2 голосов
/ 10 июня 2011

Если вам нужно одно выражение 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']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...