Groovy过滤action为eSign的XML节点时!=操作符异常问题求助
问题根因
- 你使用
parsed.data.'**'进行深度遍历时,会匹配到所有层级的子节点,包括没有action子节点的节点(比如id、uname、action本身、甚至外层data节点) - 对于没有
action子节点的节点,调用it.action.text()会返回空字符串,空字符串满足!= 'eSign'的条件,会被纳入删除列表 - 删除这些节点时会连带删除上层合法的父节点,最终导致所有节点被清空
修复方案
先限定遍历范围为外层data下的直接子data节点,这些节点才包含action字段,修正后代码如下:
import com.sap.gateway.ip.core.customdev.util.Message; import java.util.HashMap; import groovy.xml.XmlUtil; import groovy.xml.StreamingMarkupBuilder; import groovy.xml.*; def Message processData(Message message) { //Body def parsed = new XmlParser().parseText(message.body) // 仅匹配外层data下的直接子data节点,过滤action不等于eSign的 parsed.data.data.findAll { it.action.text() != 'eSign' }.each { it.parent().remove(it) } message.body = XmlUtil.serialize(parsed) return message; }
如果你只需要提取所有符合条件的uname值,不需要保留XML结构,可以直接用下面的代码获取结果列表:
def eSignUnames = parsed.data.data.findAll { it.action.text() == 'eSign' }.collect { it.uname.text() }
内容的提问来源于stack exchange,提问作者justexecute
相关产品推荐
相关产品推荐

