基于子孙的孙子的XML选择

时间:2012-11-13 09:56:30

标签: xml xpath tree

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

如果是以下示例。我正在搜索直接在根目录下的所有节点,哪些节点包含名为'Test'的任何子节点


XML STRING:

<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"]")

我需要的不是2条路径的“联合”,而是“重叠”。有人知道怎么做吗?

1 个答案:

答案 0 :(得分:4)

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

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

它会抓取Program的所有直接子项,然后选择name属性值为'Test'或包含后代的那些。{/ p>

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

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

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

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