DataWeave重复键过滤:XML中指定Pronoun值的提取优化方案
可靠获取Workday XML中Pronoun对应Value的方案
问题背景
需要从给定的Workday XML响应里,找到<wd:Integration_Field_Override_Data>节点下,包含<wd:ID>值为Pronoun的对应<wd:Value>。现有代码靠ID的顺序(取第1个ID判断)来过滤,一旦ID生成顺序变了,逻辑就失效了,得换个更稳的实现方式。
原始XML数据
<?xml version="1.0" encoding="UTF-8"?> <wd:Get_Workers_Response xmlns:wd="urn:com.workday/bsvc" wd:version="v33.0"> <wd:Response_Data> <wd:Worker> <wd:Worker_Data> <wd:Worker_ID>1129</wd:Worker_ID> <wd:User_ID>126</wd:User_ID> <wd:Integration_Field_Override_Data> <wd:Field_Reference> <wd:ID wd:type="WID">916f7f9977422e610e634</wd:ID> <wd:ID wd:type="Integration_Document_Field_Name" wd:parent_type="Integration_Document_Name" wd:parent_id="INT005 - OVERRIDE SERVICE - WORKER">Position as of Hire</wd:ID> </wd:Field_Reference> <wd:Value>0086186</wd:Value> </wd:Integration_Field_Override_Data> <wd:Integration_Field_Override_Data> <wd:Field_Reference> <wd:ID wd:type="WID">916f7f969d1b57422e610e734</wd:ID> <wd:ID wd:type="Integration_Document_Field_Name" wd:parent_type="Integration_Document_Name" wd:parent_id="INT005 - OVERRIDE SERVICE - WORKER">Probation Period Outcome</wd:ID> </wd:Field_Reference> </wd:Integration_Field_Override_Data> <wd:Integration_Field_Override_Data> <wd:Field_Reference> <wd:ID wd:type="WID">438411e0d12510b6d9a0000</wd:ID> <wd:ID wd:type="Integration_Document_Field_Name" wd:parent_type="Integration_Document_Name" wd:parent_id="INT005 - OVERRIDE SERVICE - WORKER">Pronoun</wd:ID> </wd:Field_Reference> <wd:Value>He/They</wd:Value> </wd:Integration_Field_Override_Data> </wd:Worker_Data> </wd:Worker> </wd:Response_Data> </wd:Get_Workers_Response>
现有问题代码
现有过滤逻辑依赖ID数组的索引位置,稳定性极差:
var pronounData = (worker.Worker_Data.*wd#Integration_Field_Override_Data filter((item, index) -> item.Field_Reference..*ID[1] == 'Pronoun')) default null
取值代码:
pronoun: pronounData[0].Value
可靠实现方案
不再卡ID的顺序,改成遍历所有<wd:ID>元素匹配Pronoun,还能结合wd:type属性进一步精准匹配,避免其他类型ID值巧合重复的情况。
基础改进版
直接检查所有ID里是否有值为Pronoun的项:
var pronounData = (worker.Worker_Data.*wd#Integration_Field_Override_Data filter( (item) -> exists(item.Field_Reference..*ID[. == 'Pronoun']) )) default null
精准匹配版(推荐)
指定匹配wd:type="Integration_Document_Field_Name"的ID,逻辑更严谨:
var pronounData = (worker.Worker_Data.*wd#Integration_Field_Override_Data filter( (item) -> exists(item.Field_Reference..*ID[. == 'Pronoun' and @wd:type == 'Integration_Document_Field_Name']) )) default null
取值代码优化
保留原有取值逻辑,添加默认值避免空指针:
pronoun: pronounData[0].Value default ''
用这套方案,不管<wd:ID>元素的顺序怎么变,都能准确拿到对应Pronoun的Value,最终预期输出为He/They。
内容的提问来源于stack exchange,提问作者Deeps
相关产品推荐
相关产品推荐

