选择具有特定名称的节点时出现问题

时间:2013-07-19 21:21:15

标签: xpath

我正在尝试使用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>

如何正确选择节点?

1 个答案:

答案 0 :(得分:0)

您提供的第二个XML片段不是有效的XML,因为它包含两个根节点。如果这确实是您的完整XML输入,那么您应该

  1. 尽可能修复它,或者将其包装在单个根节点中并
  2. 尝试从XPath引擎中获取一些错误消息。
  3. 我把它包装在另一个元素中,你的第二个XPath有点工作 - 但可能没有返回预期的结果;

    ,当你走得太远时,会返回item20和item21的节点名元素。

    无论如何,当你走下XML树时,你最好在谓词中检查“item20”:

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

    这不仅限制了您正在寻找的节点,而且在大多数情况下也应该更快。


    如果性能真的很重要且您正在寻找的<Prp/>元素始终处于相同的位置,请尝试避免后代或自我步骤//并提供完整的不同路径,这将是

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