【问题标题】:Finding all nodes without any text node查找没有任何文本节点的所有节点
【发布时间】:2013-08-26 07:06:33
【问题描述】:

使用 XPath (.NET),我试图选择不包含任何文本节点的所有节点。

鉴于这份文件:

<root>
  <node1>
    <node1a>Node 1A</node1a>
  </node1>
  <node2>Node 2</node2>
  <node3>
    <node3a>Node 3A</node3a>
    <node3b></node3b>
  </node3>
  <node4></node4>
  <node5>
    <node5A></node5A>
  </node5>
</root>

我很想得到节点:

<node3b></node3b>

<node4></node4>

<node5>
  <node5A></node5A>
</node5>

注意重叠子树是合并的,所以node5A不要单独返回。

我希望这能成功,但由于某种原因(当有人指出时这可能很明显)它没有:

//*[count(//text()) = 0]

注意:我正在使用XPath tester 进行尝试。

【问题讨论】:

    标签: .net xpath


    【解决方案1】:

    Arg...就在发布时,解决方案突然出现:

    //*[count(.//text()) = 0]
    

    解释:条件count(//text()) = 0 从根开始计算所有文本节点,始终大于零。要从当前节点开始计数,我需要在点前面加上:count(.//text()) = 0

    请注意,@jvverde 正确地指出节点可以在结果集中多次出现。所以这个表达式与我提到的条件不完全匹配,因为 node5A 在那里两次:

    <node3b></node3b>
    
    <node4></node4>
    
    <node5>
      <node5A></node5A>
    </node5>
    
    <node5A></node5A>
    

    【讨论】:

      【解决方案2】:

      假设您的结果示例确实是您想要的(与标题中的陈述不完全一致)上面的建议

      //*[count(.//text()) = 0]
      

      或首选方式

      //*[not(.//text())]
      

      不工作,因为结果不是你所期望的

      <node3b />
      <node4 />
      <node5>
        <node5A />
      </node5>
      <node5A /> <!-- this node is not present in your example -->
      

      如果你想要的是没有任何文本节点的所有子树不包含在其他结果子树中,那么解决方案就是这个

      //*[not(.//text())][not(ancestor::*[not(.//text())])]
      

      第二个谓词从结果中删除所有至少有一个祖先的节点已经包含在结果中

      【讨论】:

      • 那里很挑剔;)我确实需要合并子树,所以我编辑了这个问题。
      【解决方案3】:

      你也可以使用//*[.=''],只要空元素应该有空字符串值。

      【讨论】:

      • 这需要先计算数据字符串,可能比计算文本节点的代价要高得多。
      【解决方案4】:

      你也可以使用更简单易读的

      //*[not(.//text())]
      

      如果您愿意,也可以将 not(...) 替换为 empty(...)

      两者都已经优化,因此即使是简单的 XPath 实现也应该能够以“快速失败”的方式实现它们(找到一个文本节点,将谓词评估为 false)。

      【讨论】:

      • 我对@9​​87654324@ 做了一些试验,然后才意识到我表达的罪魁祸首在哪里。我会试试你的建议,所以你可能会得到奖励;)
      猜你喜欢
      • 2012-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-13
      • 2023-03-23
      相关资源
      最近更新 更多