【问题标题】:dataweave 2.0 transformation数据编织 2.0 转换
【发布时间】:2020-08-28 15:33:46
【问题描述】:

我有一个包含嵌套元素的 XML 文件,并且很少有元素具有它的属性。我想使用 dataweave 2.0 将此 XML 转换为 json,并且 json 必须包含属性。

Using the json generated from previous step, I want to recreate the original XML

Ex: <elem1>
<elem2 attr=Val>
<elem3 attr=Val>
</elem3>
</elem2>
</elem1>

Thanks in advance

【问题讨论】:

  • JSON 不支持属性。您需要如何将它们映射到 JSON?请添加一个示例 JSON 输出。

标签: transformation dataweave


【解决方案1】:

带有属性的 JSON 到带有属性的 XML:

%dw 2.0
output application/xml

fun collectAttributes(elem:Object) = 
    elem filterObject ((value, key, index) -> key contains  "@" )

fun putAttributes(elem: Object) =
    elem mapObject ((value, key, index) -> value match {
        case is Object -> do {
            var attr = collectAttributes(value)
            var withoutAttr = value -- attr
            ---
            (key) @((attr)): 
                if (keysOf(withoutAttr) contains "__text" as Key)
                    withoutAttr."__text" 
                else 
                    putAttributes(withoutAttr)
        }
        else -> (key): value
    })
        
---
putAttributes(payload)

我不确定将每个带有属性的 JSON 是否完全概括,但适用于您的情况。

带有属性的 XML 到 JSON: 你可以试试 writer 属性writeAttributes

%dw 2.0
output application/json writeAttributes=true
---
payload

https://docs.mulesoft.com/mule-runtime/4.3/dataweave-formats-json#properties

【讨论】:

  • 感谢克里斯蒂安。我得到了这个的第一部分。现在使用通过此转换创建的 JSON,我需要重新创建原始 xml。对此有何意见?
  • 请将其添加到问题中或创建一个新问题。
  • 感谢 Christian 提供的功能。它有效,但只有一个小问题是该属性在 XML 元素中以 @ 开头。无论如何要删除它?
【解决方案2】:

您可以尝试使用此脚本转换回 xml

%dw 2.0
output application/xml writeDeclaration=false
fun json2xml(data) = data mapObject (v, k, i) -> {
    ((k) @(
        (
            if(v is Object and !isEmpty(searchForAttr(v))) searchForAttr(v)
            else null
        )
    ): v match {
        case is Object -> if(namesOf(v) contains("__text")) searchForText(v) else json2xml(v)
        else -> v
    }) if (!(k contains "@") and !(k contains "__text"))
}
fun searchForAttr(v) = v mapObject {
    (($$[1 to -1]): $) if(($$ as String) startsWith("@")) 
}
fun searchForText(v) = v mapObject {
    (($$):$) if(($$ as String) == "__text")
} pluck $
---
json2xml(payload)

我尝试使用更复杂的 xml 结构,它确实转换回原始 xml,但是初始转换为 JSON(使用 writeAttributes 选项)忽略了 xml 命名空间,因此如果您的原始输入有命名空间可能需要使用 JSON 转换走另一条路线。

【讨论】:

  • application/dw 仅用于调试,在生产应用程序中使用它会导致性能问题。
【解决方案3】:

使用 Christian 的方法,您可以更新脚本以从属性键中删除“@”:

%dw 2.0
output application/xml

fun collectAttributes(elem:Object) = 
    elem filterObject ((value, key, index) -> key contains  "@" )

fun putAttributes(elem: Object) =
    elem mapObject ((value, key, index) -> value match {
        case is Object -> do {
            var attr = (collectAttributes(value))
            var attrfinal = attr mapObject {
                ($$ replace "@" with ""):(($))
            }
            var withoutAttr = value -- attr
            ---
            (key) @((attrfinal)): 
                if (keysOf(withoutAttr) contains "__text" as Key)
                    withoutAttr."__text" 
                else 
                    putAttributes(withoutAttr)
        }
        else -> (key): value
      })
        
---
putAttributes(payload)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    相关资源
    最近更新 更多