【问题标题】:XPath expression to select *all* elements, text nodes, and comment nodes in source order用于按源顺序选择 *all* 元素、文本节点和注释节点的 XPath 表达式
【发布时间】:2012-06-04 14:35:36
【问题描述】:

选择所有元素、文本节点和注释节点的 XPath 表达式是什么,其顺序与它们在文档中出现的顺序相同?

以下有效选择所有元素,但不选择文本节点和注释节点:

var result = document.evaluate('//*', document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null),
    index = -1;
while (++index < result.snapshotLength) {
  console.log(result.snapshotItem(index));
}

是否可以执行以下操作? (注意:这是非功能性伪代码。)

document.evaluate('//* and text() and comment()');

【问题讨论】:

    标签: javascript html dom xpath


    【解决方案1】:
    //node()
    

    选择作为某事物子节点的每个节点:即所有元素、文本节点、cmets 和处理指令(但不包括属性、命名空间节点或文档节点)

    【讨论】:

    • 哇!短而甜。这很好用;它还选择了根元素——对于 HTML 文档,甚至是 DOCTYPE(我不知道这是可能的)。
    • 直到document.evaluate('//node()', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue === document.doctype
    • 如果它选择了一个 DOCTYPE 节点,那么有人想象地解释了 XPath 规范; XPath 数据模型中没有这样的节点。
    • 感谢您的信息; Opera 确实不匹配 DOCTYPE 节点。我已将此提交为 WebKit 错误bugs.webkit.org/show_bug.cgi?id=87888。欢迎随时加入更多细节!
    【解决方案2】:

    使用 XML 文档中的文本和注释节点进行测试。可能有一种更有效的方法,但这会使用 union 以文档顺序为我返回元素、文本和注释节点:

    //*|//*/text()|//*/comment()
    

    【讨论】:

    • 问题是关于 HTML(不一定是 XML),因此您可以在此 Stack Overflow 页面上的控制台中尝试它,例如。也就是说,您的答案似乎工作正常。作为 XPath n00b,我不知道 | — 谢谢!
    • 啊,在这种情况下,欢迎以union 的身份来到|,并立即警告在XPATH 1.0 中它仅适用于查询的根目录,您不能从中途使用它通过“路径”。
    • 哦,引导您的 XPATH 知识的一个好方法是查看一些顶级用户对标签的回答:stackoverflow.com/tags/xpath/topusers
    猜你喜欢
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多