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

标签 xpath

任何人都可以提供 XPath 表达式来选择所有具有显式“xmlns”属性的节点,例如<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”节点。

最佳答案

从技术上讲,正确的答案是...

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

然而...

你可以伪造它使用以下 XPath 2.0 表达式:

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

这将选择在同一命名空间中没有祖先的任何元素,这在理论上意味着它选择了声明命名空间的所有元素。但是,它不会捕获重新声明的 namespace 。例如,考虑这个文件:
<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 .

关于XPath:选择具有显式 'xmlns' 属性的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9036359/

相关文章:

python - 从网站抓取表格时遇到问题?

iphone - 如何获取html文件的一部分?

c# - 迭代大型 XML 文件并复制选择节点

xpath - 如何解析以下html代码获取 "br"标签之前的所有文本

android - 例如 : I would want to write an xpath that would click an element based on the input value

xpath - 使用 Xpath 比较属性值

java - 在 Java 中的字符串上使用 xpath?

java - 使用 selenium 访问 <td> 值

xpath - xpath-包含精确文本的元素,但减去兄弟元素?

xml - 确定上下文节点在另一个节点集中的位置