【问题标题】:Xpath filter by attribute value and select alternate attributeXpath 按属性值过滤并选择备用属性
【发布时间】:2013-05-27 19:47:57
【问题描述】:

我遇到了 XPath 查询问题。我正在使用//link[@rel='alternate'],但这会返回一个空节点集。我正在尝试编写一个查询,该查询将为 rel=alternate

的所有 link 节点选择 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']");

【问题讨论】:

  • 您能否也发布您当前正在尝试使用的代码?
  • //link[@rel='alternate'] $xmlDoc = simplexml_load_file("filepath.xml"); $nodelist = $xmlDoc-&gt;xpath("//link[@rel='alternate']);
  • 我试过你的代码,count($xml-&gt;xpath('//link[@rel="alternate"]')) 返回 2,这是正确的:3v4l.org/iG8o8
  • 我敢打赌,您的实际 XML 中有一些命名空间声明。在发送 XPath 查询之前注册它们。

标签: php xml xpath blogger


【解决方案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">

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

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

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

【讨论】:

    猜你喜欢
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    • 2011-05-31
    • 1970-01-01
    • 2014-08-19
    相关资源
    最近更新 更多