【问题标题】:DIfference between Select all href attributes and Select all anchor elements with href attributes using xpath with phpSelect all href 属性和 Select all anchor elements with href attributes using xpath with php
【发布时间】:2011-08-11 23:05:08
【问题描述】:

鉴于在 html 文档中所有锚元素都设置了 href 属性:

以下xpath查询有什么区别

案例一:

//@href

案例 2:

//a/@href

案例 3:

*/a/@href

在我的情况下:

//@href 返回 href 属性中包含的所有数据。

//a/@href 什么都不返回,但我希望它返回与//@href 相同的结果

*/a/@href 什么都不返回,但我希望它返回与 //@href//a/@href 相同的结果

我担心我严重误解了这些查询的工作原理。有没有人可以让我直截了当。提前感谢您的帮助。

【问题讨论】:

  • 你接受了一个非常错误的答案。

标签: php xpath href


【解决方案1】:

两者有什么区别 跟随 xpath 查询

案例一:

//@href

这会选择 XML 文档中的所有 href 属性节点。

案例 2:

//a/@href 

这会选择属于任何名为 a 且不在命名空间中的元素的所有 href 属性。

案例 3:

*/a/@href

这将选择属于任何名为 a 的元素的所有 href 属性,该元素不在命名空间中并且是当前(上下文)节点的孙节点。

很可能你想写

//*/a/@href

这将选择属于任何名为 a 的元素的所有 href 属性,该元素不在命名空间中且其父元素是一个元素。

在我的情况下:

//@href 返回所有数据 包含在href 属性中。

//a/@href 只返回我 期望它返回与 //@href

*/a/@href 只返回我 期望它返回与 //@href//a/@href

我担心我很严重 误解了这些查询 工作。有没有人可以设置我 直的。预先感谢您 您的帮助。

一个非常常见的情况是 XML 文档有一个默认的命名空间。这很可能是您的问题的原因。在这种情况下,文档中不存在“无命名空间”中的 a 元素,并且任何以 a 作为位置步骤的 XPath 表达式都不会选择任何内容。

除此之外,三个表达式不等价

//@href//a/@href

如果文档中有除a 之外的其他元素具有href 属性,或者如果文档位于默认命名空间中,则可以选择不同的节点集。在最后一种情况下,第二个表达式什么都不选择。

//a/@href//*/a/@href

如果文档的顶部元素是具有href 属性的a,则可以选择不同的节点集。这个顶部元素的href 属性被第一个XPath 表达式选中,但没有被第二个选中,因为顶部元素的父级不是元素(它是根节点/)。

【讨论】:

    【解决方案2】:

    您尚未显示源文档。但我敢打赌你犯了 #1 XSLT 错误,即忘记或没有注意到它声明了一个默认命名空间,这意味着像 //a 这样的无前缀名称不会选择任何元素。

    【讨论】:

    • 这是我将在 [us.battle.net/wow/en/character/black-dragonflight/rustrazor/… 上执行此类搜索的页面示例的链接
    • 正常情况下 //a/@href 和 //@href 应该返回相同的结果集。那么我正在处理的使 //a/@href 返回一个空集的文档有什么不同?
    • @Wes:请参阅我的答案以获得解释。
    • @Wes:谷歌搜索“XPath 默认命名空间”。您需要使用//h:a 而不是//a,首先确保(不确定在PHP 中这是如何完成的)前缀h 绑定到命名空间“w3.org/1999/xhtml”(或实际上命名空间是:您给出的是 XHTML 命名空间 URI 的损坏)。
    【解决方案3】:

    如果要选择具有属性的节点,请使用以下语法://a[@href]。我不完全确定为什么另一种方法不起作用,因为它在原则上是有道理的。我猜 XPath 是怎样的。

    【讨论】:

    • 当使用这种方法时,我收到一个空集,而我应该收到与 //@href 相同的值,如果你说的是仪式并且所有锚点都设置了 href 值(它们确实如此)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-06
    • 1970-01-01
    • 2021-12-27
    • 2022-01-23
    • 2022-06-10
    • 1970-01-01
    相关资源
    最近更新 更多