如何在Grails中动态呈现XML?

时间:2011-09-13 14:36:24

标签: xml grails dynamic groovy

我正在设置一个应用程序,该应用程序根据特定于每个调用实例的XML文件启动电话呼叫。出于测试目的,我使用Groovy MarkupBuilder和StringWriter方法将我的XML写入单个文件,然后在下次启动调用时覆盖该文件。

但是,这在生产中不起作用,因为我们将覆盖当前正在使用的XML。所以,我想通过调用类似于:

的方式在控制器中动态创建XML
callInstance.createXml()

使用“createXml”方法,该方法包含有关如何针对每个调用专门呈现XML的规则。

我发现有多个人询问如何将对象转换为动态创建的XML文件,但这有点不同,因为我必须使用MarkupBuilder。

快速参考,这是我正在使用的一个小例子:

def f1 = new File('filename')
f1.delete()
def writer = new StringWriter()
        def xml = new MarkupBuilder(writer)
            xml.doubleQuotes = true
            xml.vxml(version:'2.1'){
                property(name:"termchar", value:"#")
                var(name:"hi", expr:"'Hello!'")
                xml.form(){
                    block(){
                        value(expr:"hi")
                        xml.goto(next:"#next") //etc, etc
                    }
                }
            }
        //break
        f1.createNewFile()
            f1 << writer.toString()

提前致谢!

1 个答案:

答案 0 :(得分:1)

你可以做的一件事(在你的控制器中)就像send the XML back from the render method一样:

def callxml = {
  def call = Call.get( params.id )
  render( contentType:"text/xml" ) {
    vxml( version:'2.1' ) {
      var( name:'hi', expr:call.message )
    }
  }
}

或者,您可以向Call类添加一个方法,因此它知道如何将自己转换为XML作为String:

class Call {
  String message

  String toXml() {
    def writer = new StringWriter()
    new groovy.xml.MarkupBuilder( writer ).with { xml ->
      xml.doubleQuotes = true
      vxml(version:'2.1'){
        var(name:"hi", expr:"${this.message}")
      }
    }
    writer.toString()
  }
}

然后你应该可以致电call.toXml()