如何使用Groovy从SOAP请求中读取User的id属性值
如何用Groovy从SOAP请求中提取User元素的id属性值
嘿,这事儿用Groovy的XML处理工具就能轻松搞定,我给你演示几种实用的方法,都是基于Groovy自带的XmlSlurper——它对XML的解析和操作特别友好。
首先先把你的SOAP请求XML贴出来方便参考:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:rol="http://www.visa.com/ROLSI"> <soapenv:Header/> <soapenv:Body> <rol:SIGetBatchQueueRequest> <rol:RequestHeader> <rol:User id="******" type="internalId"/> <rol:MemberRole>A</rol:MemberRole> </rol:RequestHeader> <rol:RequestData> <rol:BatchQueueType>AWAITING_ACTION_BQ_PRE_FILING</rol:BatchQueueType> <!--Optional:--> <rol:PageNum>?</rol:PageNum> </rol:RequestData> </rol:SIGetBatchQueueRequest> </soapenv:Body> </soapenv:Envelope>
方法1:直接按节点路径访问(最简单)
如果你的SOAP结构固定,直接顺着节点层级找就行,XmlSlurper会自动处理XML的命名空间前缀:
def soapXml = '''上面的SOAP XML内容''' // 初始化XmlSlurper并解析XML文本 def slurper = new XmlSlurper() def envelope = slurper.parseText(soapXml) // 顺着节点路径拿到User元素的id属性 def userId = envelope.Body.SIGetBatchQueueRequest.RequestHeader.User.@id.text() println userId // 输出 ******
解释:@id表示获取元素的id属性,text()用来提取属性的具体值。
方法2:明确指定命名空间(更稳妥)
如果XML里有多个命名空间,或者你想避免节点名冲突,可以主动声明命名空间后再访问节点:
def soapXml = '''上面的SOAP XML内容''' def slurper = new XmlSlurper() def envelope = slurper.parseText(soapXml) // 声明rol命名空间对应的URI envelope.declareNamespace(rol: 'http://www.visa.com/ROLSI') // 用命名空间前缀精准定位节点 def userId = envelope.Body.'rol:SIGetBatchQueueRequest'.'rol:RequestHeader'.'rol:User'.@id.text() println userId
这种方式更严谨,尤其是在复杂XML场景下不容易出错。
方法3:灵活查找元素(适配结构变化)
如果你的SOAP结构可能有变动,不想硬编码节点路径,可以用深度遍历的方式查找目标元素:
def soapXml = '''上面的SOAP XML内容''' def slurper = new XmlSlurper() def envelope = slurper.parseText(soapXml) envelope.declareNamespace(rol: 'http://www.visa.com/ROLSI') // 遍历所有节点,找到第一个rol:User元素并取id属性 def userId = envelope.depthFirst().find { it.name() == 'rol:User' }?.@id.text() println userId
解释:depthFirst()会遍历XML的所有节点,find()方法筛选出符合条件的元素,?.是Groovy的安全导航运算符,避免找不到元素时出现空指针异常。
内容的提问来源于stack exchange,提问作者user3415068
相关产品推荐
相关产品推荐

