Groovy 使用MarkupBuilder构建静态XML时使用XMLParser中的数据
我希望包含从XMLParser检索的数据,并使用MarkupBuilder构建一个新文件 我很难弄清楚这是怎么回事 C:/file.xml:Groovy 使用MarkupBuilder构建静态XML时使用XMLParser中的数据,groovy,Groovy,我希望包含从XMLParser检索的数据,并使用MarkupBuilder构建一个新文件 我很难弄清楚这是怎么回事 C:/file.xml: <externalData> <data><nestedData><soOnAndSoForth/></nestedData></data> </externalData> def writer = new StringWriter() def xml =
<externalData>
<data><nestedData><soOnAndSoForth/></nestedData></data>
</externalData>
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>
预期结果:
<externalData>
<data><nestedData><soOnAndSoForth/></nestedData></data>
</externalData>
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>
我得到的:
<externalData>
<data><nestedData><soOnAndSoForth/></nestedData></data>
</externalData>
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和使用其他工具,请告诉我。谢谢 如中所述,您可以使用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中逐字插入字符串
我不会说它漂亮或健壮,但我认为它很管用。颠簸,仍然不确定该走哪条路。。。