【问题标题】:How to search for empty/void nodes/elements in XPath?如何在 XPath 中搜索空/空节点/元素?
【发布时间】:2019-09-10 10:35:31
【问题描述】:

我有以下 XML 示例,我需要一个 XPath 查询来返回 only node1node3

<root>
    <node1 />
    <node2 anyAttribute="anyText" />
    <node3> </node3>
    <node4>anyText</node4>
    <node5>
        <anyChildNode />
    </node5>
</root>

换句话说,一个 XPath 查询返回所有节点(同时):

  1. 没有属性
  2. 没有子节点
  3. 没有或只有空格的内容

我找到了一些解决方案(12),但一次只适用于以上几点:

  • 对于 1./root/node()[not(node())] - 经过测试并且可以正常工作
  • 对于 2./root/node()[not(@*)] - 经过测试并且可以正常工作
  • 对于 3./root/node()[string-length(normalize-space(text())) = 0] - 不工作(不知道为什么)

是的,我知道,我可以同时使用上面的 3 个变体,但我想避免它,我认为只搜索空节点/元素应该有一个简单的方法,或者?


我也仅限于xPath 1.0 上的.NET,因为there is no progress 支持较新的版本。

【问题讨论】:

    标签: c# .net xml xpath xpath-1.0


    【解决方案1】:

    这个 XPath,

    /root/*[not(@* or * or text()[normalize-space()])]
    

    将根据要求仅选择 node1node3

    解释: 选择 root 的所有 element(注意与 node 的区别)没有属性 (@*) 或元素 (*) 或非子元素的子元素空白文本 (text()[normalize-space()])。

    【讨论】:

    • +1 工作正常;在想使用node() 会比* 快,但似乎我把它和`\\` 混淆了。
    猜你喜欢
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多