1

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

我究竟做错了什么?

下面是我正在使用的 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']");
4

1 回答 1

1

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

您需要注册该名称空间并在 XPath 表达式中使用它。请参阅此答案以了解如何执行此操作。

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

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

这种看似微不足道的变化意味着<feed>所有从它派生的元素都不在命名空间中,而在实际输入数据中,它们都在 Atom 命名空间中。这可以解释为什么您的 XPath 表达式在对示例输入进行测试时有效(如@Passerby 所说),但在实际输入上无效。

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

xpath("//a:link[@rel='alternate']")
于 2013-05-28T18:40:20.963 回答