2011-09-13 59 views
2

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

但是,这在生产中不起作用,因为我们将覆盖当前正在使用的XML。所以,我想用类似调用它动态地创建一个XML控制器:

callInstance.createXml() 

用含有具体如何渲染XML为每个呼叫规则“createXml”的方法。

我发现人们询问如何将对象转化为动态创建的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

你见过[本条](http://www.ibm.com/developerworks/library/j-grails09168/)? 3岁,但它仍然有一些很好的信息。 –

回答

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) 
    } 
    } 
} 

或者,你可以添加一个方法的调用类,因此它知道如何将其转换为XML作为字符串:

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()

+0

感谢您的快速回复。我没有试图将输出打印到日志中,我试图渲染文本,以便将参数传递给函数,所以我认为这不会起作用。我正在寻找一个函数,我可以调用一个调用实例,将调用实例的参数输入到生成的XML中。即:

+0

@Benjamin改变了我的回应,希望我更接近你的意思:-) –

+0

所以,如果我要解决这个问题第一种方式,它会允许我在托管操作中指向外部应用程序?例如:http:// localhost:8080/project/controller/callxml?现在,我正在根据托管的xml文件指挥一个调用。这是否会以同样的方式行事?我很抱歉,我对此很陌生! –