You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 22:09:14