Как динамически рендерить XML в Grails? - PullRequest
2 голосов
/ 13 сентября 2011

Я настраиваю приложение, которое инициирует телефонные звонки на основе файлов 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 Ответ

1 голос
/ 13 сентября 2011

Одна вещь, которую вы могли бы сделать (в своем контроллере), это отправить XML обратно из метода рендеринга примерно так:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...