从xml获取节点

从xml获取节点,xml,groovy,xml-parsing,xmlslurper,Xml,Groovy,Xml Parsing,Xmlslurper,我不明白为什么这段代码无法从xml字符串中获取某个节点。 下面的代码将抛出此错误:groovy.util.slurpersupport.NodeChildren.attributes()适用于参数类型:()值:[] 谢谢你解释如何解决这个问题 def xml ='''<ProcessDefinition> <activity name="MergeLogData"> <inputBindings> <Sub

我不明白为什么这段代码无法从xml字符串中获取某个节点。 下面的代码将抛出此错误:groovy.util.slurpersupport.NodeChildren.attributes()适用于参数类型:()值:[]

谢谢你解释如何解决这个问题

def xml ='''<ProcessDefinition>
    <activity name="MergeLogData">
        <inputBindings>
            <SubmitLogMsgRequest>
                <MsgLevel>
                    <value-of select="$Start/SubmitLogMsgRequest/MsgLevel"/>
                </MsgLevel>
                <for-each select="SubmitLogMsgRequest/LogMsg">
                    <LogMsg>
                        <for-each select="ErrorReport">
                            <ErrorReport>
                                <MsgCode>
                                    <value-of select="MsgCode"/>
                                </MsgCode>
                            </ErrorReport>
                        </for-each>
                    </LogMsg>
                </for-each>
            </SubmitLogMsgRequest>
        </inputBindings>
    </activity>
</ProcessDefinition>'''


groovy.util.slurpersupport.GPathResult Process  = new XmlSlurper().parseText(xml) 

Process.depthFirst().grep { it.name()=="activity" && it.@name=="MergeLogData"}.each{activity->
   traverse(activity.inputBindings) // why is it not possible to point to the sub node "inputBindings" here ??
   //traverse(activity) this would work, but its pointing to the wrong node, I want it to be "inputBindings"
}

public void traverse(node) {
    StringBuffer ret = new StringBuffer()
    node.attributes().each(){attribute ->
        println "ATTRIBUTE VALUE: $attribute.value"
    }

    node.children().each {child->
            if(child.name().length()>0)
                println "NODE name: ${child.name()}"
            traverse(child)
    }          
}     
defxml=''
'''
groovy.util.slurpersupport.GPathResult进程=新的XmlSlurper().parseText(xml)
Process.depthFirst().grep{it.name()=“activity”&&it.@name==“MergeLogData”}。每个{activity->
traverse(activity.inputBindings)//为什么不能在此处指向子节点“inputBindings”??
//遍历(活动)这会起作用,但它指向了错误的节点,我希望它是“inputBindings”
}
公共空心导线测量(节点){
StringBuffer ret=新的StringBuffer()
node.attributes().each(){attribute->
println“属性值:$ATTRIBUTE.VALUE”
}
node.children()。每个{child->
if(child.name().length()>0)
println“节点名称:${child.name()}”
遍历(子对象)
}          
}     

因为
inputBindings
是节点的集合-可能有多个
inputBindings
。更正代码如下:

def xml ='''<ProcessDefinition>
    <activity name="MergeLogData">
        <inputBindings>
            <SubmitLogMsgRequest>
                <MsgLevel>
                    <value-of select="$Start/SubmitLogMsgRequest/MsgLevel"/>
                </MsgLevel>
                <for-each select="SubmitLogMsgRequest/LogMsg">
                    <LogMsg>
                        <for-each select="ErrorReport">
                            <ErrorReport>
                                <MsgCode>
                                    <value-of select="MsgCode"/>
                                </MsgCode>
                            </ErrorReport>
                        </for-each>
                    </LogMsg>
                </for-each>
            </SubmitLogMsgRequest>
        </inputBindings>
    </activity>
</ProcessDefinition>'''


groovy.util.slurpersupport.GPathResult Process  = new XmlSlurper().parseText(xml) 

Process.depthFirst().grep { it.name()=="activity" && it.@name=="MergeLogData"}.each{activity->
   traverse(activity.inputBindings[0]) 
}

public void traverse(node) {
    StringBuffer ret = new StringBuffer()
    node.attributes().each(){attribute ->
        println "ATTRIBUTE VALUE: $attribute.value"
    }

    node.children().each {child->
            if(child.name().length()>0)
                println "NODE name: ${child.name()}"
            traverse(child)
    }          
} 
defxml=''
'''
groovy.util.slurpersupport.GPathResult进程=新的XmlSlurper().parseText(xml)
Process.depthFirst().grep{it.name()=“activity”&&it.@name==“MergeLogData”}。每个{activity->
遍历(activity.inputBindings[0])
}
公共空心导线测量(节点){
StringBuffer ret=新的StringBuffer()
node.attributes().each(){attribute->
println“属性值:$ATTRIBUTE.VALUE”
}
node.children()。每个{child->
if(child.name().length()>0)
println“节点名称:${child.name()}”
遍历(子对象)
}          
}