Groovy 使用MarkupBuilder构建静态XML时使用XMLParser中的数据

Groovy 使用MarkupBuilder构建静态XML时使用XMLParser中的数据,groovy,Groovy,我希望包含从XMLParser检索的数据,并使用MarkupBuilder构建一个新文件 我很难弄清楚这是怎么回事 C:/file.xml: <externalData> <data><nestedData><soOnAndSoForth/></nestedData></data> </externalData> def writer = new StringWriter() def xml =

我希望包含从XMLParser检索的数据,并使用MarkupBuilder构建一个新文件

我很难弄清楚这是怎么回事

C:/file.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中逐字插入字符串


我不会说它漂亮或健壮,但我认为它很管用。

颠簸,仍然不确定该走哪条路。。。