当xml元素相同时,如何在Groovy中解析XML中的CDATA

时间:2017-04-30 16:04:16

标签: xml groovy soapui

我有一个XML响应,如下所示,它包含CDATA以及具有相同名称的xml元素

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <soap:Body>
      <GetISDResponse xmlns="http://www.webserviceX.NET">
         <GetISDResult><![CDATA[<NewDataSet>
  <Table>
    <code>355</code>
    <name>Albania</name>
  </Table>
  <Table>
    <code>355</code>
    <name>Albania</name>
  </Table>
</NewDataSet>]]></GetISDResult>
      </GetISDResponse>
   </soap:Body>
</soap:Envelope>

我如何在soapui Groovy中读取代码的值并命名xml元素。我尝试了各种博客的所有类型的建议,但没有成功

此外,我使用的是SOAPUI 5.3.0免费软件,而不是SOAPUI PRO。

2 个答案:

答案 0 :(得分:1)

XML解析器将CDATA部分的内容作为简单文本节点提供。您需要提取CDATA部分的字符串值并再次解析它。

我不知道为什么人们将XML放在像这样的CDATA部分中 - 这是一件不正常的事情,如果你对设计XML的人有任何影响,那就让他们改变他们的方式。同时,你必须解析内容两次。

答案 1 :(得分:0)

需要提取cdata部分,然后解析它以获取所需的数据。

您可以在Script Assertion

下方使用
def response = context.response

assert response, 'response is empty or null'

//Closure to parse and extract the data
def getData = { data, element ->
  def pXml = new XmlSlurper().parseText(data)
  def codes = pXml.'**'.findAll { it.name() == element}  
}

//Get the cdata part
def cdata = getData(response, 'GetISDResult')[0] as String
log.info cdata

//Get the table data as map
def tableMap = getData(cdata, 'Table').inject([:]){m, item -> m[item.code.text()] = item.name.text();m}
log.info tableMap

tableMap.each { log.info "code : ${it.key} and name : ${it.value}" }

您可以快速在线试用 Demo