MuleSoft Dataweave JSON 到 XML,重新集成 writeAttributes=true 中的属性

问题描述 投票:0回答:1

我使用

writeAttributes=true
属性将 XML 片段转换为 JSON。

XML:

<family surname="Simpsons">
  <father age="42">Homer</father>
  <mother age="41">Marge</mother>
  <children>
    <child age="9">Bart</child>
    <child age="8">Lisa</child>
    <child age="1">Maggie</child>
  </children>
</family>

数据编织:

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

生成的 JSON:

{
  "family": {
    "@surname": "Simpsons",
    "father": {
      "@age": "42",
      "__text": "Homer"
    },
    "mother": {
      "@age": "41",
      "__text": "Marge"
    },
    "children": {
      "child": [
        {
          "@age": "9",
          "__text": "Bart"
        },
        {
          "@age": "8",
          "__text": "Lisa"
        },
        {
          "@age": "1",
          "__text": "Maggie"
        }
      ]
    }
  }
}

XML 属性和值通过使用修改后的键保留在 JSON 中:“

@key
”表示属性,“
__text
”表示值。 虽然使用
writeAttributes
writer 属性从 XML 到 JSON 的操作非常简单,但似乎没有等效的方法可以执行相反的操作。 使用这种结果格式,我想将类似的 JSON 转换为原始 XML。

将 JSON 转换回 XML 并重新集成属性的最简单方法是什么?


编辑:

在上面生成的 JSON 负载上使用aled的变换here,我能够得到接近的结果,但子数组元素没有重新获取年龄属性。

aled 的 DataWeave:

%dw 2.0
output application/xml
fun getAttributes(x) =
   x match {
      case is Object -> x filterObject ($$ as String startsWith "@") 
         mapObject ((value, key, index) -> (key[1 to -1] ): value)
      else -> $
   }
fun convertToAttributes(x) =
   x match  {
      case is Object -> x filterObject !($$ as String startsWith "@")
         mapObject ($$) @((getAttributes($))): convertToAttributes($)
      case is Array -> x map convertToAttributes($)
      else -> $
   }
---
convertToAttributes(payload)

生成的 XML:

<?xml version='1.0' encoding='UTF-8'?>
<family surname="Simpsons">
  <father age="42">Homer</father>
  <mother age="41">Marge</mother>
  <children>
    <child>Bart</child>
    <child>Lisa</child>
    <child>Maggie</child>
  </children>
</family>

__text
以某种方式成为变换过程中的值。

我不确定为什么它没有获取数组中的年龄。

json xml dataweave mulesoft
1个回答
0
投票

试试这个:

%dw 2.0
output application/xml
---
{
    family @(surname: payload.family.'@surname'): {
        father @(age: payload.family.father.'@age'): 
payload.family.father.'__text',
        mother @(age: payload.family.mother.'@age'): 
payload.family.mother.'__text',
        children: {
            (payload.family.children.child map (child) -> {
                child @(age: child.'@age'): child.'__text'
            })
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.