【问题标题】:Dataweave 2.0 - Create tree structured xmlDataweave 2.0 - 创建树形结构的 xml
【发布时间】:2020-12-10 09:25:21
【问题描述】:

我有如下从数据库中检索到的 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","ProjectLvl":2,"desc":"A1234.2-desc"}, 
    { "Projectid":"A1234.2.1","ProjectLvl":3,"desc":"A1234.2.1-desc"}
]

我必须创建以下 xml。你能帮助在 mule 变换组件中使用 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> 

【问题讨论】:

  • 您能否再描述一下分组/嵌套逻辑?

标签: dataweave


【解决方案1】:

嗨,好问题我的解决方案尝试使用树上的 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    
                    }
                })
            }
        )
    )
}

【讨论】:

  • 这将给出一个嵌套两层深的树.. 将其调整为 project.Projectid[sizeOf("A123") to 1] 也许?
  • 你好马哈瓦尔。感谢您提供解决方案。当我尝试时。我没有获得 1 级和 4 级 xml。你能看看有什么问题吗?谢谢
  • 尝试将路径变量更新为:var path = [1] ++ (project.Projectid[sizeOf("A1234") to -1] default "" splitBy "." filter !isEmpty($) map ($ as Number + 1))
【解决方案2】:

尝试使用 path 变量

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

【讨论】:

  • 嗨 Salim,这并没有给出我需要的结构。它给。 A1234-descA1234.1-descA1234.1.1-descA1234.1.1.1-descA1234.2-descA1234.2.1-desc
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-11
  • 1970-01-01
相关资源
最近更新 更多