我希望包含从XMLParser检索的数据,并使用MarkupBuilder构建新文件。
我无法弄清楚这是如何运作的。
C:/file.xml:
<externalData>
<data><nestedData><soOnAndSoForth/></nestedData></data>
</externalData>
Code.groovy:
def writer = new StringWriter()
def xml = new groovy.xml.MarkupBuilder(writer).'root'("id":"foo") {
File content = new File("C:/file.xml")
def externalFile = new XmlParser(false,true,true).parse(content)
// may or may not modify this external data...
externalFile.each { elem -> ${elem} }
'moreData'('id':'myData')
}
println writer.toString()
预期结果:
<root id="foo">
<externalData>
<data><nestedData><soOnAndSoForth/></nestedData></data>
</externalData>
<moreData id="myData">
</root>
我得到了什么:
<root id="foo">
<$ />
<moreData id="myData">
</root>
编辑:如果我在这里采取了错误的方法,例如不使用MarkupBuilder并使用其他东西,请告诉我。谢谢!
答案 0 :(得分:0)
如another thread中所述,您可以使用StreamingMarkupBuilder和XmlSlurper解决此问题。
如果您需要继续使用MarkupBuilder,以下内容会逐字插入xml流:
import groovy.xml.*
def serialize = { xml ->
def sw = new StringWriter()
new XmlNodePrinter(new PrintWriter(sw)).print(xml)
sw.toString()
}
def writer = new StringWriter()
new MarkupBuilder(writer).'root'("id":"foo") {
def otherXml = new XmlParser(false,true,true).parse(new File('file.xml'))
// may or may not modify this external data...
mkp.yieldUnescaped("\n " + serialize(otherXml).readLines().join("\n "))
'moreData'('id':'myData')
}
println writer.toString()
只是:
mkp.yieldUnescaped(serialize(otherXml))
如果我们不关心格式化,那就足够了。
以上打印出来:
<root id='foo'>
<externalData>
<data>
<nestedData>
<soOnAndSoForth/>
</nestedData>
</data>
</externalData>
<moreData id='myData' />
</root>
我们使用XmlNodePrinter而不是XmlUtil.serialize来删除xml声明行。 mkp.yieldUnescaped
将字符串逐字插入xml。
我不会称之为漂亮或健壮,但我认为它确实起到了作用。