使用Groovy脚本对XML载荷实现类VLOOKUP,识别员工/经理身份
问题修正:识别XML中用户的员工/经理身份
需求说明
遍历输入的XML载荷,将每个UserID与所有ManagerID对比,判断该用户身份:
- 若UserID出现在任意一个ManagerID中,标记为
Manager - 否则标记为
Employee
输入XML载荷
<Employee> <EmpJob> <UseriD>AAAAA</Userid> <ManagerID>XXXX</ManagerID> </EmpJob> <EmpJob> <UseriD>BBBBB</Userid> <ManagerID>YYYY</ManagerID> </EmpJob> <EmpJob> <UseriD>CCCC</Userid> <ManagerID>ZZZZ</ManagerID> </EmpJob> <EmpJob> <UseriD>XXXX</Userid> <ManagerID>YYYY</ManagerID> </EmpJob> <EmpJob> <UseriD>YYYY</Userid> <ManagerID>ZZZZ</ManagerID> </EmpJob> </Employee>
期望输出
<Employee> <EmpJob> <UseriD>AAAAA</Userid> <ManagerID>XXXX</ManagerID> <Usertype>Employee</Usertype> </EmpJob> <EmpJob> <UseriD>BBBBB</Userid> <ManagerID>YYYY</ManagerID> <Usertype>Employee</Usertype> </EmpJob> <EmpJob> <UseriD>CCCCC</Userid> <ManagerID>ZZZZ</ManagerID> <Usertype>Employee</Usertype> </EmpJob> <EmpJob> <UseriD>XXXX</Userid> <ManagerID>YYYY</ManagerID> <Usertype>Manager</Usertype> </EmpJob> <EmpJob> <UseriD>YYYY</Userid> <ManagerID>ZZZZ</ManagerID> <Usertype>Manager</Usertype> </EmpJob> </Employee>
错误代码分析
你当前的代码仅将每个用户的UserID与自己的ManagerID对比,逻辑完全不符合需求——只有当用户自己是自己的经理时才会标记为Manager,这显然不是预期结果。
错误代码:
def Message processData(Message message) { def body = message.getBody(java.lang.String) as String def xml = new XmlSlurper().parseText(body) xml.EmpJob.each { empJob -> def userID = empJob.UseriD.text() def managerID = empJob.ManagerID.text() def userType = userID == managerID ? "Manager" : "Employee" empJob.appendNode { Usertype(userType) } } def transformedXml = groovy.xml.XmlUtil.serialize(xml) message.setBody(transformedXml) return message }
修正后的代码
核心思路:先收集所有ManagerID到集合中,再逐个检查UserID是否存在于该集合中:
def Message processData(Message message) { def body = message.getBody(java.lang.String) as String def xml = new XmlSlurper().parseText(body) // 收集所有ManagerID到Set集合,提升查询效率 def allManagerIds = xml.EmpJob.ManagerID*.text() as Set xml.EmpJob.each { empJob -> def userID = empJob.UseriD.text() // 判断当前UserID是否是任意用户的经理 def userType = allManagerIds.contains(userID) ? "Manager" : "Employee" empJob.appendNode { Usertype(userType) } } def transformedXml = groovy.xml.XmlUtil.serialize(xml) message.setBody(transformedXml) return message }
关键说明
- 使用
Set存储ManagerID:相比List,Set的contains方法查询效率更高,数据量大时优势明显 - 逻辑修正:不再局限于当前用户的ManagerID,而是对比所有用户的ManagerID,完全匹配需求定义
内容的提问来源于stack exchange,提问作者Roy
相关产品推荐
相关产品推荐

