Groovy脚本-员工报告结构-遍历XML以查找所需的领导者

lf3rwulv  于 2022-12-22  发布在  其他
关注(0)|答案(1)|浏览(85)

我有两个xm0n1x节点结合在一起。第一个数据源发送员工和经理ID信息(节点)和第二个数据源发送所有领导ID信息(只有领导ID列表中的节点,领导可以是经理的经理或直接经理或2-up/3-up),他们都结合在<multimap>标签。
我想遍历<multimap1>节点的<PerPerson>,检查经理ID,直到我在中找到领导ID,找到领导ID后,在员工记录(节点)中添加一个节点。
救命啊!
XML文件:

<?xml version='1.0' encoding='UTF-8'?>
<multimap:Messages xmlns:multimap="http://sap.com/xi/XI/SplitAndMerge">
<multimap:Message1>    
  <PerPerson>
    <PerPerson>
    <empId>12345</empId>
    <userAccountNav>
      <UserAccount>
        <user>
          <User>
            <manager>
              <User>
                <mgrEmpId>67891</mgrEmpId>
              </User>
            </manager>
          </User>
        </user>
       </UserAccount>
    </userAccountNav>
    </PerPerson>
    <PerPerson>
    <empId>67891</empId>
    <userAccountNav>
      <UserAccount>
        <user>
          <User>
            <manager>
              <User>
                <mgrEmpId>12123</mgrEmpId>
              </User>
            </manager>
          </User>
        </user>
      </UserAccount>
    </userAccountNav>
    </PerPerson>
    <PerPerson>
    <empId>56789</empId>
    <userAccountNav>
      <UserAccount>
        <user>
          <User>
            <manager>
              <User>
                <mgrEmpId>12123</mgrEmpId>
              </User>
            </manager>
          </User>
        </user>
       </UserAccount>
    </userAccountNav>
    </PerPerson>
    <PerPerson>
    <empId>12123</empId>
    <userAccountNav>
      <UserAccount>
        <user>
          <User>
            <manager>
              <User>
                <mgrEmpId>67678</mgrEmpId>
              </User>
            </manager>
          </User>
        </user>
       </UserAccount>
    </userAccountNav>
    </PerPerson>
  </PerPerson>
</multimap:Message1>
<multimap:Message2>
    <rfc:ZZH_LEADER_WF_GET_APPROVERS.Response xmlns:rfc="urn:sap-com:document:sap:rfc:functions">
        <LEADER>12123</LEADER>
        <LEADER>23234</LEADER>
        <LEADER>34345</LEADER>
        <LEADER>56567</LEADER>
        <LEADER>67678</LEADER>      
    </rfc:ZZH_LEADER_WF_GET_APPROVERS.Response>
</multimap:Message2>
</multimap:Messages>

所需结果:在上面的雇员和经理数据内标签itearte直到经理ID是领导者ID之一在rfc/得到批准者列表.一旦发现添加领导者ID标签与ID内标签

<?xml version='1.0' encoding='UTF-8'?>
  <PerPerson>
    <PerPerson>
    <empId>12345</empId>
    <userAccountNav>
      <UserAccount>
        <user>
          <User>
            <manager>
              <User>
                <mgrEmpId>67891</mgrEmpId>
              </User>
            </manager>
          </User>
        </user>
       </UserAccount>
    </userAccountNav>
    <leader>12123<leader>
    </PerPerson>
    <PerPerson>
    <empId>67891</empId>
    <userAccountNav>
      <UserAccount>
        <user>
          <User>
            <manager>
              <User>
                <mgrEmpId>12123</mgrEmpId>
              </User>
            </manager>
          </User>
        </user>
      </UserAccount>
    </userAccountNav>
    <leader>12123<leader>
    </PerPerson>
    <PerPerson>
    <empId>56789</empId>
    <userAccountNav>
      <UserAccount>
        <user>
          <User>
            <manager>
              <User>
                <mgrEmpId>12123</mgrEmpId>
              </User>
            </manager>
          </User>
        </user>
       </UserAccount>
    </userAccountNav>
    <leader>12123<leader>
    </PerPerson>
    <PerPerson>
    <empId>12123</empId>
    <userAccountNav>
      <UserAccount>
        <user>
          <User>
            <manager>
              <User>
                <mgrEmpId>67678</mgrEmpId>
              </User>
            </manager>
          </User>
        </user>
       </UserAccount>
    </userAccountNav>
    <leader>67678<leader>
    </PerPerson>
  </PerPerson>

我试过的代码

map = message.getProperties();
   def body = message.getBody(java.lang.String) as String;
def messageLog = messageLogFactory.getMessageLog(message);

 def xml = new XmlParser().parseText(body)

    def ns = new groovy.xml.Namespace('http://sap.com/xi/XI/SplitAndMerge')
def rfcNs = new groovy.xml.Namespace('urn:sap-com:document:sap:rfc:functions')
   
//for fast search let map PERNR value to a node that contains it, like internal table
def leaderMap = xml[ns.Message1][0][rfcNs.get("ZHR_GET_AWARD_LEADERS.Response")][0].children().collectEntries{ [it.LEADER_LIST.item.text().replaceFirst("^0+(?!\$)", ""), it] }

  
//itearte msg1 -> find entry in leaderMap -> add node
xml[ns.Message2][0].PerPerson[0].each{p->
def emp = p.PerPerson[0]
def leader = leaderMap[p.PerPerson.userAccountNav.UserAccount.user.User.manager.User.mgrEmpId.text()]
if(leader)
{
 //  def counter = counter + 1
   p.PerPerson.appendNode('leader', null, leader.text() )
}

}

错误:代码未根据找到的匹配经理ID筛选领导ID

> java.lang.NoSuchMethodException: No signature of method:
> groovy.util.NodeList.appendNode() is applicable for argument types:
> (java.lang.String, null, java.lang.String) values: [leader, null, 000000710000008000000184000005020000053000000638000008750000090600001630000125800001341000014010000152800001623000019900000199300002413000030580000340200004157000051720000525300013698000159520001555000162800016170001647000206000021458000215180002278000249080002629400030650004117000417]
jv2fixgn

jv2fixgn1#

我在你的代码里发现了一些错误:

  1. NodeList没有appendNode。这就是出现该错误的原因
  2. p已经是一个节点。
  3. ZHR_GET_AWARD_LEADERS.Response标记在提供的xml中不存在,所以我将其更改为ZZH_LEADER_WF_GET_APPROVERS.Response
    我做了什么使它工作:
    1.使用new Node(p, 'leader', leader.text())示例化“Node”,从而在xml中创建新节点
    1.删除对children()的调用,并在收集到leaderMap之前添加collect { it }
    1.删除了循环闭包内的PerPerson调用
    1.创建了查找员工领导的算法
代码
import com.sap.gateway.ip.core.customdev.util.Message;
import java.util.HashMap;
import groovy.xml.XmlUtil;

def Message processData(Message message) {
    def body = message.getBody(java.lang.String) as String
    def xml = new XmlParser().parseText(body)
    def ns = new groovy.xml.Namespace('http://sap.com/xi/XI/SplitAndMerge')
    def rfcNs = new groovy.xml.Namespace('urn:sap-com:document:sap:rfc:functions')

    // I HAD TO CHANGE THE LINE BELOW BECAUSE THE XML DIDN't HAVE "ZHR_GET_AWARD_LEADERS.Response"
    //for fast search let map PERNR value to a node that contains it, like internal table
    def leaderMap = xml[ns.Message2][0][rfcNs.get("ZZH_LEADER_WF_GET_APPROVERS.Response")][0]\
                        .collect { it }.collectEntries { [it.text().replaceFirst("^0+(?!\$)", ""), it] }

    // All employee manager's, including the managers themselves
    def upManagers = xml[ns.Message1][0].PerPerson[0].collect { it }.collectEntries { p ->
        [p.empId.text(), p.userAccountNav.UserAccount.user.User.manager.User.mgrEmpId.text()]
    }

    // itearte msg1 -> find entry in leaderMap -> add node
    xml[ns.Message1][0].PerPerson[0].each { p ->
        def manager = p.userAccountNav.UserAccount.user.User.manager.User.mgrEmpId.text()
        def leader = leaderMap[manager]
        while (!leader && manager) {
            manager = upManagers[manager]
            leader = leaderMap[manager]
        }
        def node = new Node(p, 'leader', leader.text())
    }
    message.setBody(XmlUtil.serialize(xml[ns.Message1][0].PerPerson[0]))
    return message
}

相关问题