2013-02-25 4 views
7

Mam bardzo prosty (myślałem) plik xml jak to ...iterację każdy węzeł xml z Groovy, drukowanie każdy węzeł

<?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> 

Problem mam stoi to, że nie można po prostu dostać w każdy węzeł osobno z tym kodem ... drukuje WSZYSTKIE rzeczy, a ja tak naprawdę próbuję zrobić, to zebrać każdy węzeł na mapę, następnie przesłać/przekształcić parę kluczy/wartości na mapie i zastąpić je (droga w dół, wiem ...)

Oto mój przerażający kod ... Czy ktoś może mnie ustawić we właściwym kierunku?

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" 
} 

Czy łatwiej byłoby manipulować tym wewnątrz mapy? (Wygenerowałem ten xml z mapą w pierwszej kolejności, myśląc, że będą pewne proste metody pracy z XML ... Zaczynam się zastanawiać po wygłupach przez wiele dni i nigdzie w zasadzie nie osiągając)

Dzięki i Pozdrawiam:

+1

dni? Czy spojrzałeś na przykłady Groovy XML? Zbierz * co * węzłów i umieść je w mapie? Trudno zrozumieć, co próbujesz zrobić. –

Odpowiedz

11

Powód, dla którego nadal pobierasz węzły wewnętrzne, jest spowodowany dwukrotnym niepoprawnym przejściem do zewnętrznej listy. Wewnętrzna pętla powinna iteracyjne tylko nad tag:

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

wyjściowa:

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

Dziękujemy! Nie rozumiałem, że pierwsza nazwa iteratora (jak w '{rzecz ->') musiała być dokładnie taka sama ... właśnie dlatego wprowadzałem pełną ścieżkę i chwytałem wszystko dwa razy. – user2109043

+0

@ user2109043 Parametr zamknięcia jest każdy obiekt w kolekcji, tutaj, tag zewnętrzny. –