【发布时间】:2015-02-10 13:47:03
【问题描述】:
我有一个具有以下 Web 服务响应的 SOAP UI 项目:
<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 中使用断言来查看 CDATA 部分的 XML 中是否存在 123。我不能简单地在 SOAP UI 断言中使用 contains,因为 123 可能会在 CDATA 部分出现几次。所以我需要使用 XPath 断言。
现在如果我添加一个断言 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 断言来做到这一点。我需要将项目移交给不懂 Groovy 的企业 :)
【问题讨论】:
-
请检查这是否有帮助? stackoverflow.com/questions/19745210/…
-
如果一切都失败了,请尝试文档:soapui.org/functional-testing/working-with-cdata.html
-
@SiKing 文档解释了我在示例中所做的,使用 Groovy,通过使用脚本获取 CDATA 节点,然后创建一个新的 XmlHolder。并再次使用它和 XPath 来获得所需的值。
-
@Rao - 谢谢,但这只会选择 CDATA 部分作为字符串。我想在 CDATA 字符串中获取一个值,它是一个 XML :)
-
您看到“4. XPath 断言和 CDATA”部分了吗?
标签: xml xpath groovy soapui assertions