我正在使用Azure Logic应用程序与旧版SOAP API集成。我想将XML(尤其是响应)转换为更易于使用的内容,例如json。
通常,我在Logic Apps中使用自定义连接器来连接到新的API。我试图为此SOAP创建一个自定义连接器,但是WSDL包含显然不允许的递归引用。我能够使用我们的APIM容器创建托管API,但仍然无法产生任何可让我创建自定义连接器的内容。因此,我开始逐个处理交易。从XML到json的Liquid转换映射似乎是理想的,但是到目前为止,我还没有使用它,即因为我无法弄清楚访问某些XML元素的命名约定(那些ID与它们的ID相同)家长)。目前,我正在使用json(xml())函数作为解决方法,但它似乎不如Liquid map理想。
您可以看到,可以通过常规命名约定轻松访问AgreementId,但是我似乎无法访问第二个RequestReportResponse节点的任何子元素。
这是我要转换的XML:
<SOAP-ENV:Envelope>
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<RequestReportResponse>
<MessageHeader>
<AgreementId>urn:agreementId:</AgreementId>
</MessageHeader>
<RequestReportResponse>
<Extension>csv</Extension>
<FileByteArray>xyzFileBytes</FileByteArray>
<FileName>xyzFileName</FileName>
<StatusCode>200</StatusCode>
<StatusDescription>SUCCESS</StatusDescription>
</RequestReportResponse>
</RequestReportResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
这是我正在使用的Liquid地图:
{
"AgreementId": " {{content.Envelope.Body.RequestReportResponse.MessageHeader.AgreementId}}",
"FileByteArray": "{{content.Envelope.Body.RequestReportResponse.RequestReportResponse.FileByteArray}}",
"FileName": "{{content.Envelope.Body.RequestReportResponse.RequestReportResponse.FileName}}",
"StatusCode": "{{content.Envelope.Body.RequestReportResponse.RequestReportResponse.StatusCode}}",
"StatusDescription": "{{content.Envelope.Body.RequestReportResponse.RequestReportResponse.StatusDescription}}"
}
预期结果:
{
"AgreementId": "urn:agreementId:",
"FileByteArray": "xyzFileBytes",
"FileName": "xyzFileName",
"StatusCode": "200",
"StatusDescription": "SUCCESS"
}
实际结果:
{
"AgreementId": "urn:agreementId:",
"FileByteArray": "",
"FileName": "",
"StatusCode": "",
"StatusDescription": ""
}
似乎Liquid对嵌套的相同标签名称没有很好的支持,我们可以使用xslt来操作xml,然后转换为所需的json。但是对我们来说,最好改进xml资源的格式,以避开嵌套的相同标签名。