2011-07-13 6 views
3

「MarkupBuilder」を使うはずですが、わかりません。 import grails.converters.XMLを「XMLとして」行うことができるように見えますが、これは本当に私が欲しいものを与えているわけではありません。 Grailsを使ってXMLを作成するにはどうすればいいですか

が、私はこれをしたい:

<Thingie> 
    <someValue>blah</someValue> 
    <hellaItems> 
    <Item> 
     <anotherValue>yaddayadda</anotherValue> 
    </Item> 
    <Item> 
     <anotherValue>different from the first</anotherValue> 
    </Item> 
    </hellaItems> 

</Thingie> 

私もどこを開始するのか分からない...

私は動的にそれをしたい場合は@Stefan?私は一般的に "ビルダー"が問題かもしれないと私は理解していないと思う。

def items = ["yaddayadda","different from the first"] 

更新:近づいているようですが、この最後の部分で私を助けることができます。私はこれをやっている:

def items = ["yaddayadda","different from the first"] 
def writer = new StringWriter() 
def xml = new MarkupBuilder(writer) 
xml.thingie() { 
    someValue('blah') 
    hellaItems(){ 
     items.each{ 
      item(){ 
       anotherValue(it) 
      } 
     } 


    } 
} 
def xmlString = writer.toString() 
println "maybe this will just work" 
println xmlString 

プリント:

maybe this will just work 
<thingie> 
    <someValue>blah</someValue> 
    <hellaItems> 
    <item> 
     <anotherValue /> 
    </item> 
    <item> 
     <anotherValue /> 
    </item> 
    </hellaItems> 
</thingie> 

なぜそこに私のanotherValue年代ではありませんか?

下記の "tmpHolder"を使用してUPDATE:SOLVEDされますが、Billはより良い構文の提案をしています。

def items = ["yaddayadda","different from the first"] 
def writer = new StringWriter() 
def xml = new MarkupBuilder(writer) 
xml.thingie() { 
    someValue('blah') 
    hellaItems(){ 
     items.each{ 
      def tmpHolder = it 
      item(){ 
       anotherValue(tmpHolder) 
      } 
     } 


    } 
} 
def xmlString = writer.toString() 
println "maybe this will just work" 
println xmlString 
+2

あなたは近くですが、私は "それ"を使用しません。特にあなたが内部に別のクロージャーを持っているならば。 try items.each {txt - > item(){anotherValue(txt)}}? – billjamesdev

+0

はい、これはtmpHolderよりずっと優れています。私はまだグルーヴを学んでいます。 – Mikey

答えて

3
import groovy.xml.MarkupBuilder 

def writer = new StringWriter() 
def xml = new MarkupBuilder(writer) 
xml.thingie() { 
    someValue('blah') 
    hellaItems(){ 
    item(){ 
     anotherValue('yaddayadda') 
    } 
    item(){ 
     anotherValue('different from the first') 
    } 
    } 
} 

writer.toString()

あなたは何を得ることはありませんか?構文はちょっと変わっていますが、これはDSLだからです。通常のグルーヴィーな "コード"のようには見えません。 as XMLは全く異なる働きをします。オブジェクトグラフが正確に投稿したXMLと一致しない限り、必要な結果は得られません。

+0

items.each {}がどこかにあるまで、私はこの答えを理解することはできません。 – Mikey

+0

どうやら私は思ったよりスマートです。 – Mikey

+0

これらの要素の最後には、メソッドcall()parensは必要ありません。 –

0

基本的に、生成されるXMLに対して細かい制御が必要な場合は、MarkupBuilderを使用してください。デフォルトの方法でオブジェクト(グラフ)をXMLにシリアライズする場合、つまりすべてのプロパティがマークアップに含まれていれば、自由に使用してください。

関連する問題