首页 文章

基于子孙的孙子的XML选择

提问于
浏览
2

我正在搜索一个XPath字符串(对于VBA Excel),它可以查找特定级别上的所有节点,并且仅在它们具有特定(大)子节点时才返回 . 无论这种嵌套是多么“深刻” . 关系:我不知道一个特定的孩子嵌套有多深,因此我无法 Build 固定的路径 .

如果是以下示例 . 我正在搜索直接位于根目录下的所有节点,并且其中包含任何包含名称“Test”的子节点

XML字符串:

<Program>
   <AA name="1"/>
   <BB name="2">
      <CC name="Test"/>
   </BB>
   <DD name="Test"/>
   <EE name="3">
      <FF name="4">
         <GG name="Test"/>
      </FF>
   </EE>
</Program>

必要的选择:

Item(0) = <BB name="2">
Item(1) = <DD name="Test">
Item(2) = <EE name="3">

以下XPath表达式为 Program 下的节点提供了

xmlDoc.selectNodes("/Program/*")

以下XPath表达式为包含名称 Test 的节点提供

xmlDoc.selectNodes("//*[@name="Test"]")

What I need is not a 'union' of the 2 paths but a 'overlap'. Does anybody know how to make this?

1 回答

  • 4

    以下XPath表达式选择您需要的内容:

    /Program/*[.//@name='Test']
    

    它获取 Program 的所有直接子项,然后选择具有 'Test' 属性值 'Test' 或包含后代的那些子项 .

    这个表达式的更详细,也许更易读的版本是:

    /Program/*[descendant-or-self::*/attribute::name='Test']
    

    所以你的VBA代码看起来像这样:

    mlDoc.selectNodes("/Program/*[descendant-or-self::*/attribute::name='Test']")
    

相关问题