2014-02-06 28 views
0

爲下面的代碼:內StreamingMarkupBuilder()使用字符串變量綁定{}在Groovy

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(‘幫我’)」在上面的代碼作爲一個字符串VAR和希望如下圖所示

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> 

是新來的常規使用,任何人幫我正確執行或找到上述情況的錯誤呢?請讓我知道如果我不得不使用StreamingMarkupBuilder和XmlMarkupBuilder以外的其他類嗎? 請注意,在我的實際場景中,文本變量實際上包含更多嵌套的子節點。

+0

在此先感謝。 –

回答

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而是爲您節省一份工作? ;-)

+0

嘿蒂姆謝謝!你的兩個解決方案都工作(第二個是建議),但對於我生成節點文本的方式,我覺得第一種方法允許我編寫更多可讀代碼。 但我仍然在想,如果我在執行某處出錯了,邏輯上讓節點寫入XML應該很容易。 –