2013-02-25 4 views
7

Ich habe eine sehr einfache (dachte ich) xml-Datei wie folgt ...Iterate durch jedes XML-Knoten mit groovigen, Drucken jeder Knoten

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 

<Things> 
<thing indexNum='1'> 
    <a>123</a> 
    <b>456</b> 
    <c>789</c> 
</thing> 
<thing indexNum='2'> 
    <a>123</a> 
    <b>456</b> 
    <c>789</c> 
</thing> 
</Things> 

Das Problem, das ich mit Blick auf bin ist, dass ich nicht einfach bekommen jeder Knoten separat mit diesem Code ... es druckt ALLE Dinge, und was ich wirklich versuche zu tun ist, jeden Knoten in einer Karte zu sammeln, dann einige Schlüssel/Wert-Paare in der Karte abzufragen/umzuwandeln und sie zu ersetzen (Weg die Straße hinunter, ich weiß ..)

Hier ist mein schrecklicher Code ... jede Chance, jemand kann mich in die richtige Richtung setzen?

def counter = 0 

Things.thing.each { tag -> 
    counter++ 
    println "\n-------------------------------- $counter ------------------------------------" 

    Things.thing.children().each { tags -> 
    println "$counter${tags.name()}: $tags" 
    return counter 
    } 
    println "\n$counter things processed...\n" 
} 

Wäre es einfacher, dies innerhalb einer Karte zu manipulieren? (Ich generierte dieses XML mit einer Karte an erster Stelle, denkend, dass es einige einfache Methoden geben würde, mit dem XML zu arbeiten ... Ich beginne mich zu wundern, nachdem ich tagelang herumgespielt habe und im Grunde nirgendwohin gekommen bin)

Danke und Grüße

+1

Tage? Haben Sie sich die Groovy XML-Beispiele angesehen? Sammle * welche * Knoten und lege sie in eine Karte? Es ist schwer zu verstehen, was du zu tun versuchst. –

Antwort

11

Der Grund, warum Sie die inneren Knoten erhalten, ist, weil Sie zweimal falsch über die äußere Liste iterieren. Die innere Schleife sollte nur über tag laufen:

doc = new XmlSlurper().parse("things.xml") 
doc.thing.each { thing -> 
    println "thing index: ${[email protected]}" 
    thing.children().each { tag -> 
    println " ${tag.name()}: ${tag.text()}" 
    } 
} 

Ausgang:

thing index: 1 
    a: 123 
    b: 456 
    c: 789 
thing index: 2 
    a: 123 
    b: 456 
    c: 789 
+0

Danke! Ich verstand nicht, dass der Name des ersten Iterators (wie in '{thing ->') genau übereinstimmen musste ... deshalb gab ich den vollen Pfad ein und packte alles zweimal. – user2109043

+0

@ user2109043 Der Closure-Parameter ist jedes Objekt in der Auflistung, hier das äußere Tag. –