【问题标题】:Simple xpath question that drives me crazy让我发疯的简单 xpath 问题
【发布时间】:2011-06-09 20:58:53
【问题描述】:

下面是我设法使用此 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>";

?>

【问题讨论】:

  • /feed//entry 没问题(/feed/entry 也应该可以)。你到底得到了什么?什么不起作用?
  • // 不是必需的(可以只是 /),但该查询似乎对我有用...
  • 您是否在示例中遗漏了命名空间?
  • 猜对了,应该是&lt;feed xmlns="http://www.w3.org/2005/Atom"&gt;
  • print_r 是 Array ( ) 时我得到的。我已经用我使用的代码更新了我的问题

标签: php xml xpath


【解决方案1】:

试试这个:

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

【讨论】:

  • 成功了!谢谢你的时间!我可以再问一件事吗?想象一下,我在数组中使用了两个提要,每个结构一个。有没有办法组合 xPath 以便它可以在两个提要上工作?就像您在 /rss/channel//item 中找不到任何结果一样,请使用您发布的代码。我希望我让自己可以理解......
  • 另一方面,是否有一项服务可以为我添加的任何提要生成相同的结构? (我想这是一种解决方法)
  • 好吧,试试一个 xpath,如果它什么也没返回,试试另一个。
  • 我相信一种解决方法是预处理 XML 以在使用 XPath 之前删除对命名空间的所有引用...当然,这可能会改变 含义过程中的 XML,因此您可能需要小心使用它。
  • 我的意思是,我将在数组中添加具有两种结构的提要。
【解决方案2】:

如果您希望单个 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']

【讨论】:

    猜你喜欢
    • 2011-03-29
    • 2014-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 2014-06-04
    • 2011-05-30
    相关资源
    最近更新 更多