不同之处在于解析树的构建方式(无论是在使用的类中,还是在方法的工作方式中)。  
如果我们编写一个闭包来询问树:
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节点包含 a String,它是该节点的文本内容。该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()叶节点才有意义,因为在叶之外,我们将所有文本连接在一起。
无论如何,希望这可以解释孩子数量的差异