从xml获取节点
我不明白为什么这段代码无法从xml字符串中获取某个节点。 下面的代码将抛出此错误:groovy.util.slurpersupport.NodeChildren.attributes()适用于参数类型:()值:[] 谢谢你解释如何解决这个问题从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
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()}”
遍历(子对象)
}
}