def xml = '''
<list>
<cars>
<model>2012</model>
<make>GM</make>
<color>Gold</color>
</cars>
</list>
'''
def item = new XmlSlurper().parseText(xml)
item.'**'.inject([]) { acc, val ->
def localText = val.localText()
acc << val.name()
if( localText ) {
println "${acc.join('/')} : ${localText.join(',')}"
acc = acc.dropRight(1) // or acc = acc[0..-2]
}
acc
}
これは必要に応じて印刷されます。上記ではdepthFirst()
、ツリーで検索を使用し、 inject を使用して (他のリストを変更しないように)、 を探していlocalText()
ます。localText()
リーフ ノードの値を示す が検出された場合は、パスと値を出力します。パスは、inject で使用されたリストに蓄積されています。simplejoin()
は、必要な形式を提供します。
上記は Groovy 2.4.5 で正常にテストされています。が利用できない場合localText()
はNodeChild
、Groovy のバージョンが 2.3.0 より古いことが原因です。これは、そのメソッドが 2.3.0 以降に追加されたためです。