0

マークアップ ビルダーのブレーキ構文を反映する groovy のロジックを使用して文字列変数を作成しましたが、問題は、マークアップ ビルダーでこの文字列を使用することは明らかに許可されていないことです。私のコードの性質上、それが必要になります。以下のような方法があれば知りたいです。

def param = "node1{ node2{ node3() } }"
def sw = new StringWriter()
def xml = new groovy.xml.MarkupBuilder(sw)

XML = xml.param

上記のコードが正しくないことはわかっていますが、私が運転していることを行う方法はありますか? 明確にするために、 param は別のコードの産物である文字列です。次のような XML を取得しようとしています。

<node1><node2><node3/></node2><node1>

ありがとう

4

1 に答える 1

2

クロージャーを次のように変更した場合 (小文字のクラス名をプロパティ名として使用することに熱心ではないため、string呼び出しました)builder

def builder = { ->
    node1 {
        node2{
            node3()
        }
    }
}

次に、これを行うことができますStreamingMarkupBuilder

String output = new groovy.xml.StreamingMarkupBuilder().bind { 
    builder.delegate = delegate
    builder()
}.toString()

そしてoutput、文字列が含まれます:

<node1><node2><node3/></node2></node1>

編集:

誤解しているようで、param変数は文字列です。その場合、これを実行して (クロージャにラップされた) String を評価し、上記とほとんど同じことを行うことができます。

def param = "node1 { node2 { node3() } }"

String output = new groovy.xml.StreamingMarkupBuilder().bind { smb ->
    Eval.me( "{ -> $param }" ).with { c ->
        c.delegate = smb
        c()
    }
}.toString()

ただし、Eval を使用する場合は注意が必要です。コードが悪意のあるものか無害なものかは気にせず、実行するだけで、アプリがクラッシュしたり、コードが削除されたり、さらに悪いことになります。

文字列を作成する代わりに、マップか何かを作成できますか? 次に、次のようなことができます。

def param = [ node1:[ node2:[ node3:'' ] ] ]

String output = new groovy.xml.StreamingMarkupBuilder().bind {
    param.each { k, v ->
        "$k" { v instanceof Map ? v.each( owner ) : mkp.yield( v ) }
    }
}
于 2014-03-19T13:07:15.200 に答える