2

私は次のxmlを持っています:

<list>         
<cars>   
<model>2012</model>
<make>GM</make>         
</cars>    
</list>

以下に示すように、これらの値をパス:値として出力したいと思います。

list/cars/model : 2012
list/cars/make : GM

どうすればこれを達成できますか?メソッドを試してみましたname()が、子アイテムの名前しか出力されません。要素までのパス全体を印刷したい。

これを行うには、xmlSlurper パーサーしか使用できません。

ありがとう。

4

2 に答える 2

1
import groovy.util.XmlSlurper
import groovy.util.slurpersupport.NodeChild;
def rootNode = new XmlSlurper().parseText('<root><one a1="uno!"/><two>Some text!</two></root>' )

def printMap 
printMap = {node, path->
     if(node.getClass() == NodeChild){
        node.childNodes().each{
           printMap(it, (path ? path + "/" : "") + node.name())
        }
     } else {
        println "${path}/${node.name()}:${node.text()}"
     }
 }
 printMap(rootNode, "")
于 2016-01-10T23:06:06.890 に答える
1
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 以降に追加されたためです。

于 2016-01-11T03:27:59.597 に答える