SOAP-UI:如何获取断言的CDATA XPath?

时间:2015-02-10 13:47:03

标签: xml xpath groovy soapui assertions

我有一个SOAP UI项目,它具有以下Web服务响应:

<env:Envelope env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <env:Header/>
   <env:Body>
      <m:invokeResponse xmlns:m="some namespace">
         <result xsi:type="xsd:string"><![CDATA[<?xml version="1.0" encoding="US-ASCII" standalone="yes"?><message><myVal>123</myVal></message>]]></result>
      </m:invokeResponse>
   </env:Body>
</env:Envelope>

我需要在SOAP UI中使用Assertion来查看存在的123,它位于CDATA部分的XML中。我不能简单地在SOAP UI断言中使用包含,因为123可能会在CDATA部分中出现。所以我需要使用XPath Assertion。

现在,如果我添加一个断言XPath匹配

//result/text()

匹配

<?xml version="1.0" encoding="US-ASCII" standalone="yes"?><message><myVal>123</myVal></message>

但如果我将表达式更改为

//result[text()]/message/myVal[text()]

应该匹配123它失败

如果我使用groovy使用脚本断言它可以工作(我只是使用Groovy来查看它是否有效)

import com.eviware.soapui.support.XmlHolder

respXmlHolder = new XmlHolder(messageExchange.getResponseContentAsXml())
respXmlHolder.declareNamespace("ns1","http://www.webserviceX.NET")

CDATAXml = respXmlHolder.getNodeValue("//result/text()")
CDATAXmlHolder = new XmlHolder(CDATAXml)

myval = CDATAXmlHolder.getNodeValue("//message/myVal")
assert myval == "123"

但我想知道是否有办法在SOAP UI中使用XPath Assertion执行此操作。我需要将项目交给那些不懂Groovy的商家:)

3 个答案:

答案 0 :(得分:1)

如果我使用脚本断言,那对我有用,希望它能为你效用

import com.eviware.soapui.support.XmlHolder
responsexmlholder = new XmlHolder(messageExchange.getResponseContentAsXml())
Cdataxml = responsexmlholder.getNodeValue("//*:payLoad")
log.info Cdataxml
Cdataxmlholder = new XmlHolder(Cdataxml.trim())
errorcode = Cdataxmlholder.getNodeValue("//*:ErrorCode")
log.info errorcode

答案 1 :(得分:0)

看起来单独使用XPath是不可能的。

由于XPath to the tag inside CDATA解释说CDATA部分未被解析,因此无法使用XPath表达式来测试CDATA部分中是否存在元素

答案 2 :(得分:0)

这是我们可以用来验证CDATA块中的数据以用于测试用例断言的最直接的方法。它将xml压缩为字符串,然后仅查找字符串。并不是那么雄辩,但是它可以满足我们的需求。它还使用了常规脚本断言。

import com.eviware.soapui.support.GroovyUtils
def rawResponse = messageExchange.getRawResponseData()
def rawResponseAsString = new String(rawResponse)
log.info rawResponseAsString
assert rawResponseAsString.contains('<myVal>123</myVal>')