XPath:选择具有显式“xmlns”属性的节点

Posted

技术标签:

【中文标题】XPath:选择具有显式“xmlns”属性的节点【英文标题】:XPath: select nodes with explicit 'xmlns' attribute 【发布时间】:2012-02-20 14:57:19 【问题描述】:

任何人都可以提供选择具有显式“xmlns”属性的所有节点的 XPath 表达式,例如<html xmlns="http://www.w3.org/1999/xhtml">? //*[@xmlns] 不起作用,因为(事实证明)xmlns 不被 XPath 视为属性。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<title>Информация по счетам, картам</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta http-equiv="cache-control" content="no-cache"/>
<meta http-equiv="pragma" content="no-cache"/>
.......

我这里只需要'html'节点。

【问题讨论】:

有可能。这是一个答案:***.com/a/3616018/1115187 【参考方案1】:

技术上正确的答案是……

不可能。您需要区分源文本所代表的抽象文档和实际源文本本身。 XPath 对抽象进行操作,而不是对源文本进行操作,xmlns 伪属性的位置只与后者相关。

不过……

您可以使用以下 XPath 2.0 表达式来伪造它

//*[not(namespace-uri()=ancestor::*/namespace-uri())]

这会选择任何在同一个命名空间中没有祖先的元素,这理论上意味着它会选择所有声明了命名空间的元素。但是,它不会捕获重新声明的名称空间。例如,考虑这个文档:

<html xmlns="http://www.w3.org/1999/xhtml">
    <head/>
    <body>
        <p xmlns="http://something">
            <p xmlns="http://something"/>
        </p>
    </body>
</html>

上面的表达式选择html 元素和第一个p。第二个p 在同一个命名空间中有一个祖先,所以它没有被选中,即使它指定了一个xmlns

【讨论】:

【参考方案2】:

这应该是不可能的,因为

<a xmlns="http://www.org/1"> <b/> </a>

等价于

<a xmlns="http://www.org/1"> <b xmlns="http://www.org/1"/> </a>

【讨论】:

以上是关于XPath:选择具有显式“xmlns”属性的节点的主要内容,如果未能解决你的问题,请参考以下文章

C#:XPath 选择具有包含子字符串的属性的节点?

如果元素具有 xmlns 属性,Xpath 将失败 [重复]

具有显式默认命名空间的 XML 文档的 XPath 和命名空间规范

如何在具有 xmlns 属性的 xml 中使用 xpath 获取特定的嵌套元素? [复制]

Xpath:选择除具有特定属性的元素之外的所有元素

xpath:查找具有给定属性的节点,其值包含字符串