2013-04-12 29 views
0

我正在嘗試使用StreamingMarkupBuilder構建XML文檔。我不知道元素的標籤名稱是什麼,直到運行時,所以我試圖找到一種方法在StreamingMarkupBuilder.bind()中指定它。我已經看到如何指定元素屬性和值,但不是標籤名稱。有任何想法嗎?如何在運行時指定StreamingMarkupBuilder標籤名稱?

def xmlBuilder = new StreamingMarkupBuilder() 

def xmlString = xmlBuilder.bind { 
    root { 
     for (MyClass obj : MyClass.list()) { 
      obj.getTagName(myValue) 
     } 
    } 
}.toString() 

return xmlString 

我想獲得:

<root> 
    <FoundTagName>myValue</FoundTagName> 
</root> 

編輯

這裏是我結束了:

MyClass.list().each { f -> 
    "$f.tagName"(f.getValue()) 
} 

我認爲這是值得注意的是,內雙引號我使用屬性名稱而不是方法名稱。

回答

1

您的意思是?

import groovy.xml.* 

def values = [ tim:12, apples:'yum' ] 

String xmlString = new StreamingMarkupBuilder().bind { 
    root { 
    values.each { k, v -> 
     "$k"(v) 
    } 
    } 
} 

assert xmlString == '<root><tim>12</tim><apples>yum</apples></root>' 

很顯然,我使用的地圖爲我的價值觀,但你應該能夠以類似的方式來使用你的類(不管它是什麼)......

+0

謝謝;這幫助了很多。我編輯了我的答案,將您對地圖的建議與我如何使用我的對象結合在一起。 – Joey

+0

一年之後的另一個問題:如果我想將''k'(v)''外部化爲閉包?在那裏我可以重複使用它的'K'的不同值,也可以做一些類似於空檢查的事情,我得到的問題就是簡單地從外部閉包返回''$ k「(v)'會使groovy抱怨undefined方法簽名k(String) –

相關問題