将Groovy MarkupBuilder与转换器混合使用

时间:2011-04-20 05:47:28

标签: xml groovy xml-serialization

我正在尝试将XML转换器创建的XML片段注入MarkupBuilder。

但是我无法正确地进行格式化,似乎有不必要的中间序列化步骤。

import grails.converters.XML
import groovy.xml.MarkupBuilder

//...

def writer = new StringWriter ()
def xml = new MarkupBuilder (writer)
xml.response {
   status ("OK")
   myList.each { it as XML } //Insert objects by converting to XML
}
println writer.toString()

所需的输出是

<response>
  <status>OK</status>
  <foo>
     <field>5</field>
  </foo>
  <foo>
     <field>5</field>
  </foo>
</response>

我目前的尝试是

def writer = new StringWriter ()
def xml = new MarkupBuilder (writer)
xml.response {
   status ("OK")
   myList.each {
     xml.mkp.yieldUnescaped ( it as XML )
   }
}
println writer.toString()

但是目前每个xml片段都以

开头
  <?xml version="1.0" encoding="UTF-8"?>

有没有更好的方法来实现这个目标?

1 个答案:

答案 0 :(得分:2)

更流畅的方法是将writer直接传递给render类的XML方法,如下所示。

def writer = new StringWriter ()
def xml = new MarkupBuilder (writer)
xml.response {
   status ("OK")
   def xmlist = myList as XML
   xmlist.render(writer)
}      

您仍然会有一次编码信息,因为render只是将其写入传入的任何writer

我看到2个选项可以摆脱这种编码信息:

  • 像你一样获取XML的字符串表示,并取消编码信息,如下所示(可以改进)
  • 使用Groovy MarkupBuilder编写您自己的XML转换器,如article中所述。

 xml.response {
    status ("OK")
    def xmlist = myList as XML
    xml.mkp.yieldUnescaped (xmlist.toString() - "&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;")
}