我正在研究 SoapUI,其中我有一个 Soap 请求,它以 Json 字符串格式输入,处理后我得到一个 XML 的 Soap 响应,JSON 格式包含在 CDATA 中。
我正在尝试使用以下代码从 Soap 响应中提取数据,但出现错误"prolog 中不允许内容"
import com.eviware.soapui.support.XmlHolder
import net.sf.json.groovy.JsonSlurper
import groovy.xml.Namespace
respXmlHolder = new XmlHolder(messageExchange.getResponseContentAsXml())
respXmlHolder.declareNamespace("ns1","http://tempuri.org/")
CDATAXml = respXmlHolder.getNodeValue("//ns1:ReportResult")
log.info(CDATAXml)
def data = new XmlParser().parseText(CDATAXml).Rpt
log info "data.findAll{it.'Name'}.size()"
肥皂响应如下所示:
<ReportResponse xmlns="http://tempuri.org/">
<ReportResult><![CDATA[{
"Report": [
{
"Name": "ABC",
"Number": "123",
"Type": "XYZ",
"Desc": "EFGH",
"Group Name": "Name123",
"Group Number": "123",
"End Date": "12/30/2014",
"Due Date": "04/15/2015",
"Completion Date": null,
"Status": "Status1",
"Received Date": "",
"Delivery Date": "",
"Location": "",
"Role": "",
},
{
"Name": "EFG",
"Number": "123",
"Type": "XYZ",
"Desc": "EFGH",
"Group Name": "Name123",
"Group Number": "123",
"End Date": "12/30/2014",
"Due Date": "04/15/2015",
"Completion Date": null,
"Status": "Status1",
"Received Date": "",
"Delivery Date": "",
"Location": "",
"Role": "Manager",
}
]
} ]]></ReportResult>
</ReportResponse>
</s:Body>
</s:Envelope>
请在这方面帮助我。
正如注释中@Rao说明的那样,您将//ns1:Result
用作 XPath,但是您的响应中不存在此节点。无论如何,作为替代而不是使用和XmlHolder
,我打算首先使用XmlSlurper
来解析 SOAP 并获取CDATA
节点,然后JSonSlurper
解析 CDATA
中包含的 JSON 并获取所需的值(在您的情况下,您似乎正在寻找Name
值属性), 请参阅以下示例:
import groovy.json.JsonSlurper
def soapResponse = '''<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<ReportResponse xmlns="http://tempuri.org/">
<ReportResult><![CDATA[{
"Report": [
{
"Name": "ABC",
"Number": "123",
"Type": "XYZ",
"Desc": "EFGH",
"Group Name": "Name123",
"Group Number": "123",
"End Date": "12/30/2014",
"Due Date": "04/15/2015",
"Completion Date": null,
"Status": "Status1",
"Received Date": "",
"Delivery Date": "",
"Location": "",
"Role": "",
},
{
"Name": "EFG",
"Number": "123",
"Type": "XYZ",
"Desc": "EFGH",
"Group Name": "Name123",
"Group Number": "123",
"End Date": "12/30/2014",
"Due Date": "04/15/2015",
"Completion Date": null,
"Status": "Status1",
"Received Date": "",
"Delivery Date": "",
"Location": "",
"Role": "Manager",
}
]
} ]]></ReportResult>
</ReportResponse>
</s:Body>
</s:Envelope>'''
// parse the soap
def xml = new XmlSlurper().parseText(soapResponse)
// get cdata node
def reportCDATA = xml.'**'.findAll{ it.name() == 'ReportResult' }
def jsonTxt = reportCDATA.pop().toString()
// parse CDATA value as JSON
def json = new JsonSlurper().parseText(jsonTxt)
// get the Name attribute values
def names = json.Report.collect { it.Name }
names.each { log.info it }
如果在评论时,您想要获取"Completion Date"
而不是 JSON 的值"Name"
您可以执行以下操作:
def completionDates = json.Report.collect { it."Completion Date"}
或者如果看起来更清晰:
def completionDates = json.Report.collect { it[Completion Date] }
考虑到在您的示例中,Report
数组包含两个对象,这两个对象都具有null
作为"Completion Date"
的值。因此,使用您的 JSON 示例def completionDates
将是[null, null]
.
希望对您有所帮助,