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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 17:55:04