違いは、解析されたツリーの構築方法(使用されるクラスとメソッドの動作の両方)です。
ツリーに問い合わせるためにクロージャーを作成する場合:
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
含まれています。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()
とにかく、これが子供の数の違いを説明することを願っています