我正在设置一个应用程序,该应用程序根据特定于每个调用实例的XML文件启动电话呼叫。出于测试目的,我使用Groovy MarkupBuilder和StringWriter方法将我的XML写入单个文件,然后在下次启动调用时覆盖该文件。
但是,这在生产中不起作用,因为我们将覆盖当前正在使用的XML。所以,我想通过调用类似于:
的方式在控制器中动态创建XMLcallInstance.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()
提前致谢!
答案 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()