【问题标题】:How to dynamically render XML in Grails?如何在 Grails 中动态呈现 XML?
【发布时间】:2011-09-13 14:36:23
【问题描述】:

我正在设置一个基于特定于每个呼叫实例的 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()

提前致谢!

【问题讨论】:

  • 你见过this article吗? 3 岁了,但它仍然有一些很好的信息。

标签: xml grails dynamic groovy


【解决方案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 作为字符串:

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

【讨论】:

  • 感谢您的快速回复。我没有尝试将输出打印到日志中,而是尝试渲染文本,以便可以将参数传递给函数,所以我认为这不会起作用。我正在寻找一个可以在调用实例上调用的函数,以将调用实例的参数输入到生成的 XML 中。即:
  • @Benjamin 改变了我的回答,希望我现在更接近你的意思 :-)
  • 那么,如果我以第一种方式解决这个问题,是否允许我将外部应用程序指向托管操作?例如:localhost:8080/project/controller/callxml?现在,我正在指导基于托管 xml 文件放置的调用。这会以同样的方式表现吗?对不起,我对此很陌生!
  • 是的,您可以通过指向 localhost:8080/project/controller/callxml?id=2 来读取给定调用的 xml,例如获取调用 #2 的 xml。您也可以通过在 url 中指定 id 参数的位置来使 UrlMappings.groovy 文件中的 URL 更整洁
  • 你也可以连接一个 Marshaller,这样你就可以做到:render call as XML。我从来没有试过这个,但是there's some info on this page
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多