当 xml 元素相同时,如何在 Groovy 中解析 XML 中的 CDATA
How to parse CDATA in XML in Groovy when xml elements are same
我有一个 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。
XML 解析器会将 CDATA 部分的内容作为简单文本节点传送。您需要提取CDATA部分的字符串值并重新解析它。
我不知道为什么人们会像这样将 XML 放在 CDATA 部分中 - 这是一种不正当的做法,如果您对设计 XML 的人有任何影响,请获取他们改变他们的方式。同时,你必须解析两次内容。
需要提取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
我有一个 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。
XML 解析器会将 CDATA 部分的内容作为简单文本节点传送。您需要提取CDATA部分的字符串值并重新解析它。
我不知道为什么人们会像这样将 XML 放在 CDATA 部分中 - 这是一种不正当的做法,如果您对设计 XML 的人有任何影响,请获取他们改变他们的方式。同时,你必须解析两次内容。
需要提取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