Dataweave 2.0-创建树形结构的xml

问题描述

我从数据库中检索了如下对象的json数组

[
    { "Projectid":"A1234","ProjectLvl":1,"desc":"A1234-desc"},{ "Projectid":"A1234.1","ProjectLvl":2,"desc":"A1234.1-desc"},{ "Projectid":"A1234.1.1","ProjectLvl":3,"desc":"A1234.1.1-desc"},{ "Projectid":"A1234.1.1.1","ProjectLvl":4,"desc":"A1234.1.1.1-desc"},{ "Projectid":"A1234.2","desc":"A1234.2-desc"},{ "Projectid":"A1234.2.1","desc":"A1234.2.1-desc"}
]

我必须创建以下xml。您可以帮助在we子转换组件中使用dataweave函数吗?

<projects>
    <project level="1">
        <desc>A1234-desc</desc>
        <project level="2">
            <desc>A1234.1-desc</desc>
            <project level="3">
                <desc>A1234.1.1-desc</desc>
                <project level="4">
                    <desc>A1234.1.1.1-desc</desc>
                </project>
            </project>
        </project>
        <project level="2">
            <desc>A1234.2-desc
            </desc>
            <project level="3">
                <desc>A1234.2.1-desc
                </desc>
            </project>
        </project>
    </project>
</projects> 

解决方法

一个不错的问题,我的解决方案尝试在树上使用reduce和递归更新来使用id中的路径更新节点

%dw 2.0
output application/xml

fun updateTree(tree,path: Array<Number>,treeNode: {}) = do {
    if(sizeOf(path) == 1)
        tree ++ treeNode
    else    
        tree mapObject ((value,key,index) -> 
            if(index + 1 == path[0] and key ~= "project")
                {
                    (key): updateTree(value,path[1 to -1],treeNode)
                }
            else
            {
                (key):value
            }
        )        
}
---
projects: {
    (
        payload reduce ((project,accumulator = {}) -> do {
            var path = project.Projectid[sizeOf("A1234") to -1] default "" splitBy  "." filter !isEmpty($) map $ as Number
            ---
                updateTree(accumulator,path,{
                    project @(level: project.ProjectLvl): {
                        desc: project.desc    
                    }
                })
            }
        )
    )
}
,

尝试使用path变量

project.Projectid[sizeOf("A123") to 1] default "" splitBy  "." filter !isEmpty($) map $ as Number

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...