我使用
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
以某种方式成为变换过程中的值。
我不确定为什么它没有获取数组中的年龄。
试试这个:
%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'
})
}
}
}