使用MarkupBuilder

时间:2017-02-06 18:15:22

标签: groovy

我希望包含从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并使用其他东西,请告诉我。谢谢!

1 个答案:

答案 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。

我不会称之为漂亮或健壮,但我认为它确实起到了作用。