如何修改没有父标记的XML有效载荷?



我使用的外部API返回有效载荷为:

<code>202</code>
<message>Accepted</message>

错误响应的一个例子是:

<code>401</code>
<message>Unauthorized</message>

问题是这个XML没有父标记。因此,如果出现错误,则表达式error.MuleMessage抛出错误,因为这是一个无效的XML。

谁能给我任何关于如何使用这个响应有效载荷的想法?

提前感谢!

输入不是有效的XML。你只是不能使用任何XML解析器或功能来处理它。

理想的解决方案是说服该API的维护者它应该返回有效的XML。

一个非常粗糙的替代方法是添加一些顶部元素,将其视为字符串并将其连接起来。这是一个hack,不是一个推荐的方法,但是如果你没有任何替代方法:

%dw 2.0
output application/json
var s = "<code>202</code><message>Accepted</message>"
var x = read("<root>" ++ s ++ "</root>", "application/xml") // not recommended
---
x.root.code

您需要在HTTP请求操作中将此输入视为文本/纯文本而不是XML,然后构建有效的XML。要做到这一点,将HTTP请求MIME类型设置为'text/plain'。

在本例中,将根标记连接到文本输入将创建一个String,该String可读为"application/xml"。一旦作为对象读取,根标记就可以被删除或以其他方式作为DW对象处理。

虽然这是一个"黑客",但错误在于源API没有在有效负载中返回有效的XML。

<?xml version="1.0" encoding="UTF-8"?>
<mule xmlns:ee="http://www.mulesoft.org/schema/mule/ee/core" xmlns:http="http://www.mulesoft.org/schema/mule/http"
xmlns="http://www.mulesoft.org/schema/mule/core"
xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/ee/core http://www.mulesoft.org/schema/mule/ee/core/current/mule-ee.xsd">
<http:listener-config name="HTTP_Listener_config" doc:name="HTTP Listener config"  >
<http:listener-connection host="0.0.0.0" port="8081" />
</http:listener-config>
<flow name="naughtyApi"  >
<http:listener doc:name="Listener" config-ref="HTTP_Listener_config" path="api" outputMimeType="text/plain"/>
<set-payload value='#[output text/plain&#10;&#10;---&#10;"&lt;code&gt;401&lt;/code&gt;&lt;message&gt;Unauthorized&lt;/message&gt;"]' doc:name="Set Payload" mimeType="application/xml"/>
</flow>
<flow name="invokeNaughtyApi" >
<http:listener doc:name="Listener"  config-ref="HTTP_Listener_config" path="test"/>
<http:request method="GET" doc:name="Request" url="http://localhost:8081/api" outputMimeType="text/plain">
<http:body ><![CDATA[#["null"]]]></http:body>
</http:request>
<set-payload value='#[output application/json --- read("&lt;root&gt;" ++ payload as String ++ "&lt;/root&gt;", "application/xml").root]' doc:name="Set Payload"  />
</flow>
</mule>

最新更新