Php 让我发疯的简单xpath问题
下面是我使用xpath打印内容的提要的结构Php 让我发疯的简单xpath问题,php,xml,xpath,Php,Xml,Xpath,下面是我使用xpath打印内容的提要的结构 $xml->xpath('/rss/channel//item') 结构 <rss><channel><item><pubDate></pubDate><title></title><description></description><link></link><author></author>&l
$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?我还缺什么吗
这是代码
<?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>";
?>
xpath('/feed//entry');
}
回声“;打印(条目);回声“;
?>
试试这个:
(/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'])
如果希望一个XPath表达式在应用于RSS或ATOM提要时可以工作,可以使用以下XPath表达式之一: 这是最精确的,但也是最冗长的:
(/rss/channel/item | /*[local-name()='feed']/*[local-name()='entry'])
这个函数忽略ATOM元素的名称空间,只匹配它们的local-name()
:
这是最简单,但最不精确,效率最低的一个:
/feed//entry正常(/feed/entry也可以)。你到底得到了什么?什么不起作用呢?
/
是不必要的(它可以是/
),但这个查询对我来说似乎很有效……有没有您在示例中遗漏的名称空间?很好的猜测,这可能是print\r
是Array()时我得到的
。我已经用我使用的代码更新了我的问题!谢谢你抽出时间来!我可以再问一件事吗?假设我在数组中使用两个提要,每个结构一个提要。有没有一种方法可以组合xPath,使其在两个提要上都能工作?例如,如果您在/rss/channel//item中找不到任何结果,请使用您发布的代码。我希望我能让自己理解……另一方面,是否有一种服务可以为我添加的任何提要生成相同的结构?(我想这是一个解决办法)好吧,试试一个xpath,如果它什么也不返回,试试另一个。我相信一个解决办法是在使用xpath之前,先预处理XML以删除对名称空间的所有引用。。。当然,这可能会改变过程中XML的含义,因此您可能需要小心使用它。我的意思是,在数组中,我将添加具有这两种结构的提要。
(/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'])
(/rss/channel/item | /*[local-name()='feed']/*[local-name()='entry'])
/*//*[local-name()='item' or local-name()='entry']