我遇到了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']");
答案 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']")