Mule 3.8.3 Studio 6.4.4
我收到一个 XML 有效负载,它是客户编号的集合。我最终需要提取每个号码并将其发送到消息传递队列。
示例传入数据:
<request func="">
<data>
<transactions time='1539262470'>
<transaction set='customers' notifyid='WMS_NADC_CUSTOMERS' type='update'>
<customers>
<customer id="CIT_1113-11" t="1539257721" y="U" w="WebUser"></customer>
<customer id="C42998-2" t="1539261561" y="N" w="WebUser"></customer>
<customer id="C42998" t="1539262040" y="U" w="WebUser"> </customer>
</customers>
</transaction>
</transactions>
</data>
</request>
收到这个后,我使用 weave 转换为 json,试图更轻松地访问 id。
%dw 1.0
%output application/json
---
{
customers: payload.request.data.transactions.transaction.customers.*customer map (cust, indexOfCustomer) ->{
customer: cust.@id as :string
}
}
转换后的有效负载现在看起来像
{
"customers": [
{
"customer": "CIT_1113-11"
},
{
"customer": "C42998-2"
},
{
"customer": "C42998"
}
]
}
此时,我正在尝试遍历有效载荷。将 for each 设置为payload.get('customers')
将我带入 jackson.node.ArrayNode。
我无法弄清楚如何访问列表中的每个对象。你们中的一个人可以告诉我该怎么做吗?
我想最终将有效负载放入如下所示的消息队列中
{
"customer": "C42998"
}
最简单的方法是使用DataWeave的组合来获取JavaIteratable
和for-each
作用域。查看此示例(假设传入的有效负载是您的 XML(。
<dw:transform-message doc:name="Transform Message">
<dw:set-payload><![CDATA[%dw 1.0
%output application/java
%var customers = payload.request.data.transactions.transaction.customers.*customer
---
customers map (customer) ->{
customer: customer.@id as :string
}]]></dw:set-payload>
</dw:transform-message>
<foreach doc:name="For Each">
<json:object-to-json-transformer doc:name="Object to JSON"/>
<logger message="#[payload]" level="INFO" doc:name="Logger"/>
</foreach>
在Mule 3中,for-each
不接受JSON或XML,即使它们显然代表了一个可以迭代的结构(例如JSON数组(。这就是为什么我们需要在DataWeave转换器中%output application/java
。稍后,在for-each
范围内,我们可以将其转换回 JSON。在您的情况下,只需将logger
替换为队列连接器即可将消息发送到需要的位置。