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

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

  1. 如果可能,修复它,或者将其包装在单个根节点中,然后
  2. 尝试从您的 XPath 引擎获取一些错误消息。

我将它包装在另一个元素中,您的第二个 XPath 有点工作 - 但可能没有返回预期的结果;item20 和 item21 的两个节点名称元素都会在您走得太远时返回。

无论如何,您最好在降级 XML 树时检查谓词中的“item20”:

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

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


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

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