Mule 4:XML 转换:如何将具有相同名称和属性的多个节点的 XML 转换为有效的 JSON 作为输出?
Mule 4 : XML transformation : How to transform XML with multiple nodes having same names and attributes to a valid JSON as output?
场景:需要将传入 XML 消息转换为 JSON 但保留所有数据。
输入:
<StudentsData>
<Student name="ABC" rollnumber="123">
<Subject name="Maths">
<Grade Sem="1st" marks="90" result="pass"/>
<Grade Sem="2nd" marks="45" result="fail"/>
</Subject>
<Subject name="English">
<Grade Sem="1st" marks="75" result="pass"/>
<Grade Sem="2nd" marks="87" result="pass"/>
</Subject>
<Subject name="Physics">
<Grade Sem="1st" marks="67" result="pass"/>
<Grade Sem="2nd" marks="78" result="pass"/>
</Subject>
</Student>
<Student name="DEF" rollnumber="456">
<Subject name="Maths">
<Grade Sem="1st" marks="56" result="pass"/>
<Grade Sem="2nd" marks="87" result="pass"/>
</Subject>
<Subject name="English">
<Grade Sem="1st" marks="98" result="pass"/>
<Grade Sem="2nd" marks="99" result="pass"/>
</Subject>
<Subject name="Physics">
<Grade Sem="1st" marks="90" result="pass"/>
<Grade Sem="2nd" marks="87" result="pass"/>
</Subject>
</Student>
</StudentsData>
方法:
%dw 2.0
output application/json duplicateKeyAsArray=true
---
payload.*StudentsData map ((Student, index) ->
{
Name : Student.Student.@name,
RollNumber : Student.Student.@rollnumber,
Subjects : Student.Student.*Subject map ((sub, index) ->{
subjectName : sub.@name,
semester : sub.Grade.@Sem,
marks: sub.Grade.@marks,
result: sub.Grade.@result
} )
} )
输出:
[
{
"Name": "ABC",
"RollNumber": "123",
"Subjects": [
{
"subjectName": "Maths",
"semester": "1st",
"marks": "90",
"result": "pass"
},
{
"subjectName": "English",
"semester": "1st",
"marks": "75",
"result": "pass"
},
{
"subjectName": "Physics",
"semester": "1st",
"marks": "67",
"result": "pass"
}
]
}
]
问题:
- 结果中只有学生 ABC 的数据可用,其余所有学生的数据都缺失
- 在 Student ABC 中,只有第一学期的成绩可用。
请帮助我理解转换中的错误。提前致谢
解决方案是:
%dw 2.0
output application/json
---
payload.StudentsData.*Student map ((student, index) -> {
Name : student.@name,
RollNumber : student.@rollnumber,
Subjects : student.*Subject map ((sub, index) -> {
Subject : sub.@name,
performance : sub.*Grade map ((item, index) -> {
semester : item.@Sem,
marks: item.@marks,
result: item.@result
} )
} )
})
输出:
[
{
"Name": "ABC",
"RollNumber": "123",
"Subjects": [
{
"Subject": "Maths",
"performance": [
{
"semester": "1st",
"marks": "90",
"result": "pass"
},
{
"semester": "2nd",
"marks": "45",
"result": "fail"
}
]
},
{
"Subject": "English",
"performance": [
{
"semester": "1st",
"marks": "75",
"result": "pass"
},
{
"semester": "2nd",
"marks": "87",
"result": "pass"
}
]
},
{
"Subject": "Physics",
"performance": [
{
"semester": "1st",
"marks": "67",
"result": "pass"
},
{
"semester": "2nd",
"marks": "78",
"result": "pass"
}
]
}
]
},
{
"Name": "DEF",
"RollNumber": "456",
"Subjects": [
{
"Subject": "Maths",
"performance": [
{
"semester": "1st",
"marks": "56",
"result": "pass"
},
{
"semester": "2nd",
"marks": "87",
"result": "pass"
}
]
},
{
"Subject": "English",
"performance": [
{
"semester": "1st",
"marks": "98",
"result": "pass"
},
{
"semester": "2nd",
"marks": "99",
"result": "pass"
}
]
},
{
"Subject": "Physics",
"performance": [
{
"semester": "1st",
"marks": "90",
"result": "pass"
},
{
"semester": "2nd",
"marks": "87",
"result": "pass"
}
]
}
]
}
]
场景:需要将传入 XML 消息转换为 JSON 但保留所有数据。 输入:
<StudentsData>
<Student name="ABC" rollnumber="123">
<Subject name="Maths">
<Grade Sem="1st" marks="90" result="pass"/>
<Grade Sem="2nd" marks="45" result="fail"/>
</Subject>
<Subject name="English">
<Grade Sem="1st" marks="75" result="pass"/>
<Grade Sem="2nd" marks="87" result="pass"/>
</Subject>
<Subject name="Physics">
<Grade Sem="1st" marks="67" result="pass"/>
<Grade Sem="2nd" marks="78" result="pass"/>
</Subject>
</Student>
<Student name="DEF" rollnumber="456">
<Subject name="Maths">
<Grade Sem="1st" marks="56" result="pass"/>
<Grade Sem="2nd" marks="87" result="pass"/>
</Subject>
<Subject name="English">
<Grade Sem="1st" marks="98" result="pass"/>
<Grade Sem="2nd" marks="99" result="pass"/>
</Subject>
<Subject name="Physics">
<Grade Sem="1st" marks="90" result="pass"/>
<Grade Sem="2nd" marks="87" result="pass"/>
</Subject>
</Student>
</StudentsData>
方法:
%dw 2.0
output application/json duplicateKeyAsArray=true
---
payload.*StudentsData map ((Student, index) ->
{
Name : Student.Student.@name,
RollNumber : Student.Student.@rollnumber,
Subjects : Student.Student.*Subject map ((sub, index) ->{
subjectName : sub.@name,
semester : sub.Grade.@Sem,
marks: sub.Grade.@marks,
result: sub.Grade.@result
} )
} )
输出:
[
{
"Name": "ABC",
"RollNumber": "123",
"Subjects": [
{
"subjectName": "Maths",
"semester": "1st",
"marks": "90",
"result": "pass"
},
{
"subjectName": "English",
"semester": "1st",
"marks": "75",
"result": "pass"
},
{
"subjectName": "Physics",
"semester": "1st",
"marks": "67",
"result": "pass"
}
]
}
]
问题:
- 结果中只有学生 ABC 的数据可用,其余所有学生的数据都缺失
- 在 Student ABC 中,只有第一学期的成绩可用。
请帮助我理解转换中的错误。提前致谢
解决方案是:
%dw 2.0
output application/json
---
payload.StudentsData.*Student map ((student, index) -> {
Name : student.@name,
RollNumber : student.@rollnumber,
Subjects : student.*Subject map ((sub, index) -> {
Subject : sub.@name,
performance : sub.*Grade map ((item, index) -> {
semester : item.@Sem,
marks: item.@marks,
result: item.@result
} )
} )
})
输出:
[
{
"Name": "ABC",
"RollNumber": "123",
"Subjects": [
{
"Subject": "Maths",
"performance": [
{
"semester": "1st",
"marks": "90",
"result": "pass"
},
{
"semester": "2nd",
"marks": "45",
"result": "fail"
}
]
},
{
"Subject": "English",
"performance": [
{
"semester": "1st",
"marks": "75",
"result": "pass"
},
{
"semester": "2nd",
"marks": "87",
"result": "pass"
}
]
},
{
"Subject": "Physics",
"performance": [
{
"semester": "1st",
"marks": "67",
"result": "pass"
},
{
"semester": "2nd",
"marks": "78",
"result": "pass"
}
]
}
]
},
{
"Name": "DEF",
"RollNumber": "456",
"Subjects": [
{
"Subject": "Maths",
"performance": [
{
"semester": "1st",
"marks": "56",
"result": "pass"
},
{
"semester": "2nd",
"marks": "87",
"result": "pass"
}
]
},
{
"Subject": "English",
"performance": [
{
"semester": "1st",
"marks": "98",
"result": "pass"
},
{
"semester": "2nd",
"marks": "99",
"result": "pass"
}
]
},
{
"Subject": "Physics",
"performance": [
{
"semester": "1st",
"marks": "90",
"result": "pass"
},
{
"semester": "2nd",
"marks": "87",
"result": "pass"
}
]
}
]
}
]