0

以下のコードの場合:

def writer = new StringWriter()
writer = new StreamingMarkupBuilder().bind {
Project(){MyTag('Help Me')}
}  
println(writer.toString()) 

the output would be: <Project><MyTag>Help Me</MyTag></Project>

上記のコードに文字列変数として「MyTag('Help Me')」があり、以下に示すように使用したい場合

def teststring = "MyTag('Help Me')"
def writer = new StringWriter()
writer = new StreamingMarkupBuilder().bind {
Project(){out<<teststring}
}
println(writer.toString()) 

the output am getting is: MyTag('Help Me')<Project></Project>
but am expecting: <Project><MyTag>Help Me</MyTag></Project>

Groovy は初めてですが、適切な実装を手伝ってくれる人や、上記のケースの間違いを見つけてくれる人はいますか? StreamingMarkupBuilder と XmlMarkupBuilder 以外のクラスを使用する必要があるかどうか教えてください。私の実際のシナリオでは、テキスト変数には実際にはネストされた子ノードがさらに多く含まれていることに注意してください。

4

1 に答える 1

0

このようなことができます。ノード文字列を にラップし{ -> }、クロージャーとして評価してから、デリゲートを設定してクロージャーを呼び出します。

import groovy.xml.*

def nodes = '''MyTag( attr:'help me' ) {
              |    AnotherTag( 'Help me!' )
              |}'''.stripMargin()

println XmlUtil.serialize( new StreamingMarkupBuilder().bind {
    Project {
        c = Eval.me( "{ -> $nodes }" )
        c.delegate = delegate
        c()
    }
} )

どちらが印刷されますか:

<?xml version="1.0" encoding="UTF-8"?><Project>
  <MyTag attr="help me">
    <AnotherTag>Help me!</AnotherTag>
  </MyTag>
</Project>

ただし、その文字列がシステムの外部からのものであるかのように注意する必要があります。そのnodes文字列は、そこに配置されたコードの実行に使用される可能性があります。

ノードを文字列で取得している場合は、代わりに XML を記述して仕事を節約してみませんか? ;-)

于 2014-02-06T09:11:34.377 に答える