Mule 4:XML转换:如何将具有相同名称和属性的多个节点的XML转换为有效的JSON作为输出



场景:需要将传入的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的数据可用,其余所有学生的数据丢失
  • 在学生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"
}
]
}
]
}
]

最新更新