2013-02-25 79 views
7

我有這樣一個非常簡單的(我認爲)的XML文件...通過迭代使用Groovy每個XML節點,打印每個節點

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

我面臨的問題是,我不能簡單地得到在每個節點都與這個代碼分開......它打印所有的東西,而我真正試圖做的是將每個節點收集到一張地圖中,然後詢問/轉換地圖中的某些鍵/值對並替換它們(我知道..)

這是我可怕的代碼...有人可以讓我在正確的方向嗎?

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

在地圖內部操縱它會更容易嗎? (我首先用一張地圖生成了這個xml,認爲會有一些簡單的方法來處理XML ...我開始懷疑,經過幾天的渾渾噩噩,幾乎沒有任何地方)

謝謝和問候

+1

天?你看過Groovy XML的例子嗎?收集哪些*節點並將它們放入地圖?很難理解你想要做什麼。 – 2013-02-25 22:31:27

回答

11

你繼續得到內部節點的原因是因爲你錯誤地遍歷外部列表兩次。內循環迭代應該只在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()}" 
    } 
} 

輸出:

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

謝謝!我並不瞭解第一個迭代器的名字(如'{thing - >')必須完全匹配......這就是爲什麼我要完整路徑並抓住所有東西兩次。 – user2109043 2013-02-26 17:22:13

+0

@ user2109043閉包參數是集合中的每個對象,這裏是外部標籤。 – 2013-02-26 17:25:05