Groovy 解析器和slurper之间的大小差异?
我试图使用groovy进行xml处理,但仍然发现很难理解它的行为。有人能给我解释一下为什么下面的程序会吐出1和0吗?在这两种情况下,我都希望为0,因为“onenode”元素没有子元素……我在这里缺少什么Groovy 解析器和slurper之间的大小差异?,groovy,xml-parsing,Groovy,Xml Parsing,我试图使用groovy进行xml处理,但仍然发现很难理解它的行为。有人能给我解释一下为什么下面的程序会吐出1和0吗?在这两种情况下,我都希望为0,因为“onenode”元素没有子元素……我在这里缺少什么 def text = """ <characters> <props> <prop>dd</prop> </props> <character id="1" name="Wallace">
def text = """
<characters>
<props>
<prop>dd</prop>
</props>
<character id="1" name="Wallace">
<likes>cheese</likes>
</character>
<character id="2" name="Gromit">
<likes>sleep</likes>
</character>
<onenode>help</onenode>
</characters>
"""
def xmlp = new XmlParser().parseText(text)
println xmlp.onenode[0].children().size() // prints out 1
def xmls = new XmlSlurper().parseText(text)
println xmls.onenode[0].children().size() // prints out 0
def text=”“”
dd
奶酪
睡觉
帮助
"""
def xmlp=new XmlParser().parseText(文本)
println xmlp.onenode[0]。children().size()//打印出1
def xmls=new XmlSlurper().parseText(文本)
println xmls.onenode[0].children().size()//打印出0
不同之处在于解析树的构建方式(包括所使用的类和方法的工作方式)
如果我们写一个闭包来询问树:
def dumpTypeTree = { node, prefix = '' ->
def name = node.respondsTo( 'name' ) ? "${node.name()} -- " : ''
def clazz = node.getClass().name
def txt = node.respondsTo('text') ? node.text() : node
println "${prefix}${name}${clazz} '${txt}'"
if( node.respondsTo( 'children' ) ) {
node.children().each { child ->
owner.call( child, "$prefix " )
}
}
}
当我们使用XmlParser
构造的树调用此方法时:
dumpTypeTree( new XmlParser().parseText(text) )
我们得到:
characters -- groovy.util.Node ''
props -- groovy.util.Node ''
prop -- groovy.util.Node 'dd'
java.lang.String 'dd'
character -- groovy.util.Node ''
likes -- groovy.util.Node 'cheese'
java.lang.String 'cheese'
character -- groovy.util.Node ''
likes -- groovy.util.Node 'sleep'
java.lang.String 'sleep'
onenode -- groovy.util.Node 'help'
java.lang.String 'help'
如您所见,onenode
节点包含一个字符串,它是该节点的文本内容。调用text()
将返回我们期望的结果
但是,使用XmlSlurper调用它:
dumpTypeTree( new XmlSlurper().parseText(text) )
给了我们:
characters -- groovy.util.slurpersupport.NodeChild 'ddcheesesleephelp'
props -- groovy.util.slurpersupport.NodeChild 'dd'
prop -- groovy.util.slurpersupport.NodeChild 'dd'
character -- groovy.util.slurpersupport.NodeChild 'cheese'
likes -- groovy.util.slurpersupport.NodeChild 'cheese'
character -- groovy.util.slurpersupport.NodeChild 'sleep'
likes -- groovy.util.slurpersupport.NodeChild 'sleep'
onenode -- groovy.util.slurpersupport.NodeChild 'help'
如您所见,没有String
子节点,只有在叶节点上调用text()
才有意义,因为在叶节点之外,我们将所有文本连接在一起
无论如何,希望这能解释孩子数量的差异谢谢蒂姆。这对我解释了很多。