0

Prp[@name='node name']XPath 式を使用して親名 item20 を持つノードを選択しようとしていますが、これは//Prp[@name='node name'and ../../../*[@name='item20']]、ファイルに XML のこの部分のみが含まれている場合にのみ機能します。

<Node name="item20">
<Node name="config">
    <Node name="runmodeparams">
    <Node name="simple">
        <Prp name="filename" type="S" value="p"/>
        <Prp name="filepath" type="S" value="r"/>
    </Node>
    <Prp name="activerunmode" type="S" value="Simple"/>
    </Node>
    <Prp name="node name" type="S" value="lastversion"/>
</Node>         

次のような XML ファイルの別の部分も含まれている場合、XPath は空の結果を返します。

<Node name="item20">
<Node name="config">
    <Node name="runmodeparams">
    <Node name="simple">
        <Prp name="filename" type="S" value="p"/>
        <Prp name="filepath" type="S" value="r"/>
    </Node>
    <Prp name="activerunmode" type="S" value="Simple"/>
    </Node>
    <Prp name="node name" type="S" value="lastversion"/>
</Node>         
</Node>

<Node name="item21">
<Node name="config">
    <Node name="runmodeparams">
    <Node name="simple">
        <Prp name="filename" type="S" value="p"/>
        <Prp name="filepath" type="S" value="r"/>
    </Node>
    <Prp name="activerunmode" type="S" value="Simple"/>
    </Node>
    <Prp name="node name" type="S" value="lastversion"/>
</Node>         
</Node>

ノードを正しく選択するにはどうすればよいですか?

4

1 に答える 1

0

2 番目に指定した XML スニペットは、2 つのルート ノードが含まれているため、有効な XML ではありません。これが実際に完全な XML 入力である場合は、

  1. 可能であれば修正するか、単一のルートノードにラップして、
  2. XPath エンジンからエラー メッセージを取得してみてください。

私はそれを別の要素でラップし、2 番目の XPath は多少機能しましたが、おそらく期待される結果は返されませんでした。踏み出しすぎているため、item20 と item21 の両方のノード名要素が返されます。

いずれにしても、XML ツリーをステップ ダウンするときは、述語で "item20" を確認することをお勧めします。

//Node[@name='item20']//Prp[@name='node name']

これは、探しているノードに限定されるだけでなく、ほとんどの場合で高速になるはずです。


パフォーマンスが本当に重要で、<Prp/>探している要素が常に同じ位置にある場合は、descendant-or-self-steps を避け、//完全に異なるパスを提供してみてください。

//Node[@name='item20']/Prp[@name='node name']
于 2013-07-19T21:38:10.630 に答える