SoapUI中Groovy获取SOAP响应Inventory节点attr1值返回null如何解决
SoapUI Groovy脚本读取Inventory节点attr1返回null问题解决
问题场景
SOAP响应内容如下:
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <soap:Body> <GetInventoriesResponse xmlns="http://xxx"> <GetInventoriesResult> <NewDataSet xmlns=""> <Inventory attr1="1" attr2="101" /> <Inventory attr1="1" attr2="101" /> </NewDataSet> </GetInventoriesResult> </GetInventoriesResponse> </soap:Body> </soap:Envelope>
需求为读取第一个Inventory节点的attr1属性值,初始编写的Groovy脚本如下:
import groovy.sql.Sql import java.sql.DriverManager import java.sql.Connection import javax.sql.DataSource import java.sql.Driver; import java.util.*; import java.text.*; def groovyUtils = new com.eviware.soapui.support.GroovyUtils( context ) def responseHolder = groovyUtils.getXmlHolder( messageExchange.responseContent ) responseHolder.namespaces['ns4']='http://xxx' def CounGetInventoriesResponse=responseHolder["count(//Inventory)"] def CompanyId=responseHolder.getNodeValue("//namf:Inventory[0]/@attr1") log.info "att1"+CompanyId
脚本执行后CompanyId输出值为null。
脚本存在的核心疏漏
- 命名空间前缀不匹配:代码里声明的命名空间前缀是
ns4,但XPath查询时错误使用了未定义的namf前缀,直接导致路径匹配失败。 - XPath索引起始值错误:XPath语法的节点索引是从1开始计数,不是编程语言常见的从0开始,写
[0]无法匹配到任何有效节点。 - 节点命名空间判断错误:观察响应结构,
<NewDataSet xmlns="">显式将自身及子节点的默认命名空间重置为空,因此下属的<Inventory>节点不属于http://xxx命名空间,查询时不需要加任何命名空间前缀。
修正后可运行脚本
// 未使用的SQL相关导入可直接删除,不影响节点解析逻辑 def groovyUtils = new com.eviware.soapui.support.GroovyUtils( context ) def responseHolder = groovyUtils.getXmlHolder( messageExchange.responseContent ) // 统计Inventory节点总数 def inventoryCount = responseHolder["count(//Inventory)"] log.info("Inventory节点总数:" + inventoryCount) // 正确写法:无命名空间前缀 + 索引从1开始 def CompanyId = responseHolder.getNodeValue("//Inventory[1]/@attr1") log.info("第一个Inventory节点的attr1属性值:" + CompanyId)
执行后即可正常输出attr1的属性值1。
补充说明:如果后续遇到命名空间不确定的情况,可以先打印
responseHolder.getDomNode("//Inventory[1]")确认节点的命名空间URI,避免前缀错配问题。
内容的提问来源于stack exchange,提问作者smiles
相关产品推荐
相关产品推荐

