dom4j通过XPath读取子节点是不对的

时间:2017-09-14 09:31:49

标签: java xpath dom4j

当我使用org.dom4j解析XML文档时,我在节点上使用XPath如下:

<JobDescription>
   <Formats Description="">
    <Format Refed="format_0" Name="MOV"  >
        <TranscodeParam VideoOutputParamRef="vo_para_28"  />
        <EnhancementParam VideoEnhancementRef="ve_para_31"  />
    </Format>
    <Format Refed="format_1" Name="WMV" >
        <TranscodeParam VideoOutputParamRef="vo_para_32"  />
        <EnhancementParam VideoEnhancementRef="ve_para_35"   />
    </Format>
   </Formats>
</JobDescription>
Node formatsNode = document.selectSingleNode("//JobDescription/Formats");

    if (formatsNode != null) {

        for (Node formatNode :
                formatsNode.selectNodes("//Format")) {
             Node transcodeParaNode = node.selectSingleNode("//TranscodeParam"); //the node always get the first node(Which VideoOutputParamRef="vo_para_28")

        }
    }

结果是错误的formatNode TranscodeParam始终是<Format>元素中的第一个元素,而不是第二个元素。

如何解决问题?

enter image description here

2 个答案:

答案 0 :(得分:0)

在for循环中,您没有使用formatNode变量,而是使用其他变量(node):

for (Node formatNode :
    formatsNode.selectNodes("//Format")) {
        Node transcodeParaNode = formatNode.selectSingleNode("//TranscodeParam"); //the node always get the first node(Which VideoOutputParamRef="vo_para_28")
}

答案 1 :(得分:0)

formatsNode.selectNodes("//Format")

这将使用//Format作为上下文节点计算XPath表达式formatsNode

以“/”开头的任何表达式都从包含上下文节点的树的根中选择,而不是从上下文节点本身中选择。如果要从上下文节点向下选择,请使用

formatsNode.selectNodes(".//Format")