在 mule 4 中将带有 CDATA 的 SOAP 响应转换为 JSON

Convert a SOAP response with CDATA to JSON in mule 4

我有这种来自 mule 4 中肥皂反应的结果。

{ body:<web:getRoutesResponse xmlns:web="http://www.example.org/Bookings/"> <out><![CDATA[<?xml version="1.0"encoding="utf-8"?><ROUTELIST><ROUTEINFO> <ORIGIN>MY-KUL</ORIGIN><DESTINATION>SG-BEU</DESTINATION><ROUTEINFO></ROUTELIST>]]></out> </web:getRoutesResponse> , headers: [], attachments: [] }

我想在这个 json 输出中生成包含起点和终点的数组

[ { "origin": "MY-KUL", "destination": "SG-BEU" } ]

该 CDATA 元素的内容是 XML 的文本表示。对于 DataWeave,它只是文本。可以用read()解析为XML,然后正常处理

例如

%dw 2.0
output application/json
---
read(payload.body.out, "application/xml").ROUTELIST.*ROUTEINFO

如果您希望标签为小写,您可能需要映射结果。

你可以试试这样的东西。与 Ale 先前的回答相同,但使用扫描在特定文本模式之间搜索内容。

输入

{
    "body": "<web:getRoutesResponse xmlns:web=\"http: //www.example.org/Bookings/\"> <out><![CDATA[<?xml version=\"1.0\"encoding=\"utf-8\"?><ROUTELIST><ROUTEINFO> <ORIGIN>MY-KUL</ORIGIN><DESTINATION>SG-BEU</DESTINATION><ROUTEINFO></ROUTELIST>]]></out> </web:getRoutesResponse>",
    "headers": [],
    "attachments": []
}

脚本

%dw 2.0
output application/json
var a = read(payload.body, "application/xml").getRoutesResponse.out
---
[{
    origin: (a scan(/\<ORIGIN>(.+?)\<\/ORIGIN>/))[0][1],
    desination: (a scan(/\<DESTINATION>(.+?)\<\/DESTINATION>/))[0][1]
}]

输出

[
  {
    "origin": "MY-KUL",
    "desination": "SG-BEU"
  }
]