首页 > 解决方案 > 如何使用 groovy 解析和更新 SoapUI 请求的 CDATA 部分?

问题描述

我正在尝试编写一个 groovy 脚本来更新 SoapUI 请求的某些 CDATA 部分。

在 SoapUI 和 groovy 方面,我都是新手。

我已经通过使用属性转移成功地完成了我需要的事情,但是,由于我需要在几乎所有测试用例中进行相同的处理,我宁愿在一个可以从任何需要的地方调用的脚本中进行。

我试图模仿 groovy 中的属性转移步骤,但没有成功,因为我似乎无法访问和解析 CDATA 部分。

任何有关如何使用 groovy 解析和更新值的帮助将不胜感激。

请求格式示例如下所示

<soapenv:Envelope xmlns:soapenv="soappath" xmlns:myns="mynamespacepath">
   <soapenv:Header/>
       <soapenv:Body>
           <myns:CMSXMLWebImport>
           <myns:xmlIn><![CDATA[<CMSCardRequest xmlns="http://mypath2">
           <Group>
            <Name>Finance</Name>
                <OrgUnit>OU=Finance,OU=Enterprise,DC=DummyDomain</OrgUnit>
                <Parent>Enterprise</Parent>
                <User>
                <Personal>
                        <FirstName>xxx</FirstName>
                        <LastName>xxx</LastName>
                        <Email>xxxx.xxx@xxx.uk</Email>
            </Personal>
                </User>
            </Group>
            </CMSCardRequest>]]></myns:xmlIn>
            </myns:CMSXMLWebImport>
        </soapenv:Body>
</soapenv:Envelope>

标签: groovysoapuicdata

解决方案


以下代码:

import groovy.xml.*

def data = '''
<soapenv:Envelope xmlns:soapenv="soappath" xmlns:myns="mynamespacepath">
 <soapenv:Header/>
 <soapenv:Body>
   <myns:CMSXMLWebImport>
     <myns:xmlIn><![CDATA[
        <CMSCardRequest xmlns="http://mypath2">
          <Group>
            <Name>Finance</Name>
            <OrgUnit>OU=Finance,OU=Enterprise,DC=DummyDomain</OrgUnit>
            <Parent>Enterprise</Parent>
            <User>
              <Personal>
                <FirstName>xxx</FirstName>
                <LastName>xxx</LastName>
                <Email>xxxx.xxx@xxx.uk</Email>
              </Personal>
            </User>
          </Group>
        </CMSCardRequest>]]>
      </myns:xmlIn>
    </myns:CMSXMLWebImport>
  </soapenv:Body>
</soapenv:Envelope>
'''

def parser = new XmlSlurper()
def xml = parser.parseText(data)
def cardXml = parser.parseText(xml.Body.CMSXMLWebImport.xmlIn.text())

println "name:       ${cardXml.Group.Name.text()}"
println "org unit:   ${cardXml.Group.OrgUnit.text()}"
println "first name: ${cardXml.Group.User.Personal.FirstName.text()}"

// or for a somewhat more succinct access pattern 
println "---------"
cardXml.Group.with { 
  println "name:       ${Name.text()}"
  println "org unit:   ${OrgUnit.text()}"
  println "first name: ${User.Personal.FirstName.text()}"
}

将导致:

~> groovy solution.groovy 
name:       Finance
org unit:   OU=Finance,OU=Enterprise,DC=DummyDomain
first name: xxx
---------
name:       Finance
org unit:   OU=Finance,OU=Enterprise,DC=DummyDomain
first name: xxx

~> 

运行时。这里的技巧是将 CDATA 部分作为字符串提取出来,然后单独解析该部分。

我还在第二个示例中使用了 groovywith方法,以更短的方式访问相同的数据。


推荐阅读