简单的xpath问题让我发疯

时间:2011-06-09 20:58:53

标签: php xml xpath

下面是我设法使用此xpath打印内容的Feed的结构 $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>";

?>

2 个答案:

答案 0 :(得分:4)

试试这个:

$xml->registerXPathNamespace('f', 'http://www.w3.org/2005/Atom');
$xml->xpath('/f:feed/f:entry');

答案 1 :(得分:2)

如果您想要一个在应用于RSS或ATOM源时可以使用的XPath表达式,则可以使用以下任一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']