我有两个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]
1条答案
按热度按时间jv2fixgn1#
我在你的代码里发现了一些错误:
NodeList
没有appendNode
。这就是出现该错误的原因p
已经是一个节点。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.创建了查找员工领导的算法
代码