2011-03-18 68 views
6

我想解析一个使用xpath的blogspot feed,但它似乎没有与我尝试的任何东西一起工作。我不确定是因为命名空间还是什么,但我希望有人能帮助我。这里是代码:php xpath问题

$xml = simplexml_load_file('http://feeds.feedburner.com/blogspot/MKuf'); 

$next = $xml->xpath("//link[@rel='next']"); 
print_r($next); 

这只是返回一个空数组,它不应该是。我试图做只是链接或只是输入,它仍然是空的。我可以运行的唯一一个可以运行的是*。任何帮助表示赞赏。

+0

你的xpath似乎错了,它实际上返回了零个元素。你想完成什么? – 2011-03-18 15:43:36

+0

该文档有一个默认名称空间,您必须先注册,然后才能使用XPath查询它。 – Gordon 2011-03-18 15:54:21

+1

可能重复的[DOM XPath查询帮助](http://stackoverflow.com/questions/5341995/dom-xpath-query-help) – Gordon 2011-03-18 15:55:12

回答

10

就像在你的评论中已经说过的那样,文档有一个默认的名称空间,你必须先注册,然后才能用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

Live Demo

3

正如戈登说,你需要注册XML文档的默认命名空间,如下所示:

$xml->registerXPathNamespace('default', 'http://www.w3.org/2005/Atom'); 

然后使用default前缀是指正常的元素:

$next = $xml->xpath("//default:link[@rel='next']"); 

新版本可以让你定义默认('')的命名空间。有关更多信息,请参阅http://www.qc4blog.com/?p=281

+0

谢谢我实际上也发现了这一点。我之前曾尝试过这样做,这就是为什么它失败了。 – ngreenwood6 2011-03-18 16:20:51

+0

这些答案之一是否解决了您的问题?点击旁边的复选标记告诉我们,并将其中一个标记为答案。 – 2011-04-11 20:15:53