【问题标题】:How can I parse and update the CDATA section of a SoapUI request using groovy?如何使用 groovy 解析和更新 SoapUI 请求的 CDATA 部分?
【发布时间】:2019-05-15 08:26:28
【问题描述】:

我正在尝试编写一个 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>

【问题讨论】:

    标签: groovy soapui cdata


    【解决方案1】:

    以下代码:

    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 部分作为字符串提取出来,然后单独解析该部分。

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

    【讨论】:

    • 感谢您的快速回复。我已经尝试了上述方法,并且可以获得单个节点。如何更新这些值,然后将它们替换回请求中以便执行?
    • 可以吗?正如我所说,我可以使用属性转移来做到这一点,但它很麻烦,我更喜欢脚本化的解决方案,并且可以从需要的任何地方调用。
    猜你喜欢
    • 2023-04-08
    • 2016-08-05
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多