我正在尝试使用XPath表达式Prp[@name='node name']
选择具有父名称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>
如何正确选择节点?
答案 0 :(得分:0)
您提供的第二个XML片段不是有效的XML,因为它包含两个根节点。如果这确实是您的完整XML输入,那么您应该
我把它包装在另一个元素中,你的第二个XPath有点工作 - 但可能没有返回预期的结果;
,当你走得太远时,会返回item20和item21的节点名元素。无论如何,当你走下XML树时,你最好在谓词中检查“item20”:
//Node[@name='item20']//Prp[@name='node name']
这不仅限制了您正在寻找的节点,而且在大多数情况下也应该更快。
如果性能真的很重要且您正在寻找的<Prp/>
元素始终处于相同的位置,请尝试避免后代或自我步骤//
并提供完整的不同路径,这将是
//Node[@name='item20']/Prp[@name='node name']