【问题标题】:grails/groovy and wslite - how to make the static XML dynamic?grails/groovy 和 wslite - 如何使静态 XML 动态化?
【发布时间】:2015-02-24 23:39:51
【问题描述】:

使用 grails ws-lite 0.7.2.0,您可以指定要通过 soap 发送的 XML 消息:

  def response = send(SOAPAction: 'http://www.27seconds.com/Holidays/US/Dates/GetMothersDay') {
  body {
     GetMothersDay(xmlns: 'http://www.27seconds.com/Holidays/US/Dates/') {
        year(2011)
     }
  }
}

我需要做的是替换其中一个静态元素,例如带有动态变量的“GetMothersDay”,例如:

String action = "GetMothersDay"
def response = send(SOAPAction: 'http://www.27seconds.com/Holidays/US/Dates/GetMothersDay') {
  body {
     $action(xmlns: 'http://www.27seconds.com/Holidays/US/Dates/') {
        year(2011)
     }
  }
}

显然上面的代码不起作用,但希望它说明了我正在尝试做的事情。

作为附加问题,外部 {} 中的内容是什么?它们是功能定义吗?例如什么是“年(2011)”,不能同时是函数定义和函数调用?

我需要替换的实际 XML 消息更长、更复杂 - 但每次调用基本相同。

非常感谢任何帮助 - 如果无法做到这一点,我将面临数百行重复代码。

【问题讨论】:

    标签: xml grails soap groovy


    【解决方案1】:

    如果表达式比一个变量更复杂并且包含空格或其他有问题的字符,请使用"$action""${action}",而不是$action

    这些是方法调用,这通常是 Groovy DSL/构建器的工作方式。它们显然不是有效的方法,但是缺少方法/缺少属性的处理程序处于活动状态,只要您调用的方法对 DSL 有效,它们就会转换为您要构建的方法。通常,方法调用的名称和/或参数用作数据并确定调用是否有效。

    对于常规的groovy.xml.MarkupBuilder(例如in this example),包含 Map 参数的方法成为名称派生自方法名称的元素,而 Map 项成为属性,例如

    car(name:'P50', make:'Peel', year:1962) 
    

    <car name='P50' make='Peel' year='1962'>
    

    使用 String arg 的方法调用成为带有 String 主体的元素,例如

    country('Isle of Man')
    

    变成

    <country>Isle of Man</country>
    

    您可以在the source of SOAPMessageBuilder.groovy 中看到,闭包的delegate 设置为构建器,因此它可以处理调用,并且它使用MarkupBuilder 来生成XML 字符串。

    Programming Groovy 2 对在 Groovy 中创建 DSL 的覆盖面特别好。

    【讨论】:

    • 很棒的答案。所以 year(2011) 是“void year(int year) {}; year(2011)”之类的简写。
    • 对,但会更轻松一些,更像void year(year) {} 并使用year.toString() 作为正文。生成器通常会允许并生成无效内容,然后解析器会抱怨&lt;year&gt;purple&lt;/year&gt;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多