2012-07-16 19 views
3

代碼,我是新來的時髦 - 我希望這是解決一個簡單的事情。我讀XML文檔中,然後我能夠訪問這樣的數據:使用String作爲使用Groovy XML解析器

def root = new XmlParser().parseText(xmlString) 
println root.foo.bar.text() 

我想要做的,就是從一個文件中加載的路徑「foo.bar」部分或數據的基礎上,這樣我可以做這樣的事情:

def paths = ["foo.bar","tashiStation.powerConverter"] // defined for this example 
paths.each { 
    path -> 
    println path + "\t" + root.path.text() 
} 

顯然是寫不工作的代碼......我想,也許這會工作:

paths.each { 
    path -> 
    println path + "\t" + root."${path}".text() 
} 

...但它沒有。我根據我的Groovy的PG的153對,其中動態方法可以以類似的方式來創建DSL初步的解決方案。

的思考?理想的解決方案不會添加大量代碼,並且不會添加任何其他庫依賴項。我總能回落到這樣的東西在Java中使用JDOM,但我希望一個優雅時髦的解決方案。

+0

[使用\ [\]]在Groovy中訪問對象屬性的可能的副本(http://stackoverflow.com/questions/4077168/access-object-properties-in-groovy-using) – 2012-07-16 15:11:34

+0

@tim_yates:看起來不一樣的東西,我在所有...並在每個迭代上插入到GroovyShell通話將引入不必要的開銷。 – 2012-07-16 15:18:08

+0

我看不到答案如何插入到GroovyShell – 2012-07-16 15:19:15

回答

3

這是非常相似的this question from 3 days agothis question

你基本上需要在.分割你的路徑,然後走這個列表通過你的對象圖移動

def val = path.split(/\./).inject(root) { obj, node -> obj?."$node" }?.text() 
println "$path\t$val" 

應該這樣做在這種情況下: - )

+0

作品!現在我需要閱讀它的工作原理,但非常感謝您的解決方案。 – 2012-07-16 15:23:25