【问题标题】:How to read values from XML Request and write into XML Response using Groovy?如何使用 Groovy 从 XML 请求中读取值并写入 XML 响应?
【发布时间】:2015-10-29 10:13:57
【问题描述】:

我正在编写一个 groovy 脚本,在该脚本中我必须从请求 XML 文件中获取值并将其写入 XML 响应文件。

我知道如何从普通 XML 中读取值,如下所示:

def text = '''
<list>
    <technology>
        <name>Groovy</name>
    </technology>
</list>
'''

def list = new XmlParser().parseText(text) 
println list.technology.name.text()

我可以使用上述语法轻松访问节点。但在我的情况下,请求文件具有“关键字:标签”语法。考虑下面提到的货币转换器请求文件:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:web="http://www.webserviceX.NET/">
<soap:Header/>
<soap:Body>
  <web:ConversionRate>
     <web:FromCurrency>USD</web:FromCurrency>
     <web:ToCurrency>INR</web:ToCurrency>
  </web:ConversionRate>
</soap:Body>
</soap:Envelope>

在这种情况下如何读取FromCurrency 的值?除了使用 XMLParser 之外,还有其他有效且好的方法来处理较大的 XML 文件吗?

此外,在响应中写入值时,我通过在脚本中创建多个变量并使用它们的值在响应中使用语法“${var_name}”来编写。

如果我想将许多值(假设 20+)从请求写入响应,那么单独写入的变量不是好方法。那么有没有什么好的有效的方法呢?

【问题讨论】:

    标签: xml groovy soapui


    【解决方案1】:

    你可以像这样得到FromCurrency(使用XmlSlurper):

    def text = '''<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:web="http://www.webserviceX.NET/">
    <soap:Header/>
    <soap:Body>
      <web:ConversionRate>
         <web:FromCurrency>USD</web:FromCurrency>
         <web:ToCurrency>INR</web:ToCurrency>
      </web:ConversionRate>
    </soap:Body>
    </soap:Envelope>'''
    
    def list = new XmlSlurper().parseText(text) 
    println list.Body.ConversionRate.FromCurrency.text()
    

    不确定我是否理解您的其余问题

    【讨论】:

    • 如何使用 XMLParser 做同样的事情?
    • 刚刚发布了 XmlParser 示例的答案,但我同意@tim_yates:XmlSlurper 有什么问题?
    • 我迟到了派对......但是我也发布了 @jalopaba 使用 XMLParser 的示例并添加了有关 soapui 案例的特定信息。当然,我完全同意 tim_yates 关于为此使用 xmlSlurper 的观点。
    • @tim_yates 感谢您的回复:)。实际上,我正在尝试将 SOAP 请求中的值复制到响应中。所以假设我想复制“FromCurrency”的值,那么我将如何从上述 xml 语法的请求上下文中获取它?
    • 我不知道这意味着什么......这是 SoapUI 的东西吗?
    【解决方案2】:

    对于XmlParser,您必须在字符串中或声明它们显式使用命名空间

    import groovy.xml.*
    
    def text = '''<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:web="http://www.webserviceX.NET/">
    <soap:Header/>
    <soap:Body>
      <web:ConversionRate>
         <web:FromCurrency>USD</web:FromCurrency>
         <web:ToCurrency>INR</web:ToCurrency>
      </web:ConversionRate>
    </soap:Body>
    </soap:Envelope>'''
    
    def s = new Namespace('http://www.w3.org/2003/05/soap-envelope', 'soap')
    def w = new Namespace('http://www.webserviceX.NET/', 'web')
    def parsed = new XmlParser().parseText(text) 
    
    assert 'USD' == parsed.'soap:Body'.'web:ConversionRate'.'web:FromCurrency'.text()
    assert '' == parsed.Body.ConversionRate.FromCurrency.text()
    assert 'USD' == parsed[s.Body][w.ConversionRate][w.FromCurrency].text()
    

    XmlSlurper 命名空间如果未声明则会被忽略:

    def slurped = new XmlSlurper().parseText(text)
    assert 'USD' == slurped.Body.ConversionRate.FromCurrency.text()
    assert '' == slurped.'soap:Body'.'web:ConversionRate'.'web:FromCurrency'.text()
    
    slurped = new XmlSlurper().parseText(text).declareNamespace([soap: 'http://www.w3.org/2003/05/soap-envelope', web: 'http://www.webserviceX.NET/'])
    assert 'USD' == slurped.Body.ConversionRate.FromCurrency.text()
    assert 'USD' == slurped.'soap:Body'.'web:ConversionRate'.'web:FromCurrency'.text()
    

    【讨论】:

      【解决方案3】:

      为此使用XMLParser 而不是XmlSlurper(顺便说一下,我更喜欢使用slurper):

      def text = '''<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:web="http://www.webserviceX.NET/">
      <soap:Header/>
      <soap:Body>
        <web:ConversionRate>
           <web:FromCurrency>USD</web:FromCurrency>
           <web:ToCurrency>INR</web:ToCurrency>
        </web:ConversionRate>
      </soap:Body>
      </soap:Envelope>'''
      
      def list = new XmlParser().parseText(text) 
      log.info list.'soap:Body'.'web:ConversionRate'.'web:FromCurrency'.text() // prints Thu Oct 29 12:27:31 CET 2015:INFO:USD
      

      然后改为在请求中添加多个属性并在脚本中逐个设置,如果您想要另一种方法,您可以构建完整的 xml 并使用以下方法直接设置 testStep 的请求属性:

      def text = '''<myNewRequest><someField1/><someField2/></myNewRequest>'''
      def request = new XmlParser(true,true).parseText(text) 
      request.someField1[0].setValue('my new value')
      request.someField2[0].setValue('another value')
      
      // converts the xml to string
      StringWriter sw = new StringWriter()
      new XmlNodePrinter(new PrintWriter(sw)).print(request)
      def modifiedRequest = sw.toString()
      // get the testStep and set the request
      context.testCase.getTestStepByName('SOAP Request').setPropertyValue('request',modifiedRequest)
      

      希望对你有帮助,

      【讨论】:

        猜你喜欢
        • 2016-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多