Xpath按属性值过滤并选择备用属性

时间:2013-05-27 19:47:57

标签: php xml xpath blogger

我遇到了XPath查询问题。我正在使用//link[@rel='alternate'],但这会返回一个null节点集。我正在尝试编写一个查询,为所有 link 节点选择href属性的值,其中 rel = alternate

我做错了什么?

下面是我正在使用的xml结构的简化示例。

<feed>
    <entry>
        <id>1980475</id>
        <link rel="post" href="http://..."></link>
        <link rel="edit" href="http://..."></link>
        <link rel="alternate" href="http://..."></link>
    </entry>
    <entry>
        <id>1980476</id>
        <link rel="post" href="http://..."></link>
        <link rel="edit" href="http://..."></link>
        <link rel="alternate" href="http://..."></link>
    </entry>
</feed>

这是我正在使用的PHP代码:

$xmlDoc = simplexml_load_file("somefile.xml");
$nodelist = $xmlDoc->xpath("//link[@rel='alternate']");

1 个答案:

答案 0 :(得分:1)

正如@Jens所说,你可能正在处理一个Atom提要。 Atom中的XML元素位于Atom名称空间中,其URI为http://www.w3.org/2005/Atom

您需要注册该命名空间并在XPath表达式中使用它。有关如何执行此操作,请参阅this answer

当您发布输入XML的“简化示例”时,您可能会删除默认的名称空间声明,如

<feed xmlns="http://www.w3.org/2005/Atom">

这个看似微不足道的变化意味着<feed>和所有来自它的所有元素都没有名称空间,而在实际输入数据中,它们位于Atom名称空间中。这可以解释为什么你的XPath表达式在样本输入上测试时会起作用(如@Passerby所说),但不适用于实际输入。

如果您注册a作为Atom命名空间的命名空间前缀,如上面链接的答案所示,您的XPath表达式将为:

xpath("//a:link[@rel='alternate']")