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"
      }
    ]
  }
]

问题:

请帮助我理解转换中的错误。提前致谢

解决方案是:

%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"
          }
        ]
      }
    ]
  }
]