2

特定のレベルのすべてのノードを検索でき、特定の (グランド) 子ノードがある場合にのみ返される XPath 文字列 (VBA Excel 用) を探しています。これがどれほど「深く」ネストされているかに関係なく。Relationale: 特定の子がどのくらいネストされているかがわからないため、固定パスを作成できません。

以下の例の場合。ルート「」の直下にあり、「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"]")

私が必要としているのは、2 つのパスの「結合」ではなく、「重なり」です。誰もこれを作る方法を知っていますか?

4

1 に答える 1

4

次の XPath 式は、必要なものを選択します。

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

の直接の子をすべてフェッチしてから、属性値を持つか、属性値を持つ子孫を含むProgramものを選択します。name'Test'

この式のより冗長で、おそらくより読みやすいバージョンは次のようになります。

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

したがって、VBA コードは次のようになります。

mlDoc.selectNodes("/Program/*[descendant-or-self::*/attribute::name='Test']")
于 2012-11-13T10:16:53.820 に答える