【问题标题】:Mule ESB 3.6 - Best way to convert BufferedInputStream to XMLMule ESB 3.6 - 将 BufferedInputStream 转换为 XML 的最佳方式
【发布时间】:2023-03-16 15:25:02
【问题描述】:

我有一个使用 HTTP 连接器的 Mule ESB 项目,我想使用 XPath 来拆分/路由 XML。

HTTP 连接器之后的消息负载是 org.glassfish.grizzly.utils.BufferInputStream。

将其转换为我可以使用诸如“拆分器”或“表达式”(使用 XPath)之类的组件来拆分/路由它的类型的最佳方法是什么?

“对象到 XML”似乎不起作用,并且当负载是字符串时(即在 HTTP 之后使用对象到字符串),拆分器不起作用。如果有标准组件可以做到这一点,我宁愿不编写自定义 Java 转换器?

流程

<http:listener-config name="HTTP_Listener_Configuration" host="0.0.0.0" port="8081" doc:name="HTTP Listener Configuration"/>
<file:connector name="File" autoDelete="true" streaming="true" validateConnections="true" doc:name="File"/>
<flow name="collectionsplitterFlow">
    <http:listener config-ref="HTTP_Listener_Configuration" path="/CollectionSplitter" doc:name="HTTP"/>
    <splitter expression="#[xpath3('//Order')]" doc:name="Splitter"/>
    <logger level="INFO" doc:name="Logger"/>
</flow>

要拆分的 XML

<?xml version="1.0" encoding="UTF-8"?>
<msglist>
    <msg>
        <Order>
            <Id>1</Id>
            <Description>Order 1</Description>
        </Order>
    </msg>
    <msg>
        <Order>
            <Id>2</Id>
            <Description>Order 2</Description>
        </Order>
    </msg>
</msglist>

谢谢 大卫

【问题讨论】:

    标签: mule mule-studio


    【解决方案1】:

    您的流程看起来不错。我在我的机器上试过了,我知道你来自哪里。尝试将 Mule 表达式从 #[xpath3('//Order')] 更改为 #[xpath('//Order')]。这样做会导致 Mule 成功生成两条 Mule 消息 - 每个 Order 元素一个。

    HTH,

    贾斯汀

    【讨论】:

    • 嗨@贾斯汀,感谢您的回复。该更改确实有效,但是 xpath MEL 在 3.6 中已弃用,并将在 4.0 中删除(根据控制台中的 WARNING 消息)。
    • 同意大卫,不幸的是我无法让它与 xpath3 一起工作。
    【解决方案2】:

    感谢stackoverflow question 的回答帮助我解决了我的问题。

    答案:

    将 NODESET 选项添加到 xpath3 MEL,然后添加 DOM 到 XML 转换器以将 DOM 对象转换回 XML。

    #[xpath3('//Order',payload,'NODESET')]
    

    我还必须将所有拆分组件添加到子流中,尤其是对于我的 HTTP 源(因为我不断收到 payloadAsString() 错误。

    骡流

    <http:listener-config name="HTTP_Listener_Configuration" host="0.0.0.0" port="8081" doc:name="HTTP Listener Configuration"/>
    <file:connector name="File" autoDelete="true" streaming="true" validateConnections="true" doc:name="File"/>
    <file:connector name="PickupFile2" autoDelete="true" streaming="false" validateConnections="true" doc:name="File"/>
    <mulexml:object-to-xml-transformer returnClass="java.lang.String" encoding="UTF-8" name="Object_to_XML" doc:name="Object to XML"/>
    <mulexml:dom-to-xml-transformer name="DOM_to_XML" doc:name="DOM to XML"/>
    <flow name="collectionsplitterFlow2">
        <http:listener config-ref="HTTP_Listener_Configuration" path="/CollectionSplitter" doc:name="HTTP"/>
        <set-session-variable variableName="Filename" value="HTTP" doc:name="Session Variable"/>
        <flow-ref name="collectionsplitterSub_Flow" doc:name="collectionsplitterSub_Flow"/>
        <set-payload value="Response2" doc:name="Set Payload"/>
    </flow>
    <sub-flow name="collectionsplitterSub_Flow">
        <splitter expression="#[xpath3('//Order',payload,'NODESET')]" doc:name="Splitter"/>
        <mulexml:dom-to-xml-transformer doc:name="DOM to XML"/>
        <logger message="#[payload]" level="INFO" doc:name="Logger"/>
        <file:outbound-endpoint path="C:\Mule\CollectionSplitter\Backup\01_SplitFile" outputPattern="#[sessionVars.Filename]-split2-#[function:datestamp].xml" connector-ref="File" responseTimeout="10000" transformer-refs="DOM_to_XML" doc:name="File"/>
    </sub-flow>
    <flow name="collectionsplitterFlow">
        <file:inbound-endpoint path="C:\Mule\CollectionSplitter\In" moveToPattern="#[message.inboundProperties['originalFilename']]-backup-#[function:datestamp].xml" moveToDirectory="C:\Mule\CollectionSplitter\Backup" connector-ref="PickupFile2" responseTimeout="10000" doc:name="File">
            <file:filename-regex-filter pattern="(.*).xml" caseSensitive="false"/>
        </file:inbound-endpoint>
        <set-session-variable variableName="Filename" value="#[message.inboundProperties['originalFilename']]" doc:name="Session Variable"/>
        <flow-ref name="collectionsplitterSub_Flow" doc:name="collectionsplitterSub_Flow"/>
        <logger level="INFO" doc:name="Logger" message="#[payload]"/>
    </flow>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-16
      • 2014-02-18
      • 1970-01-01
      • 2012-01-10
      • 1970-01-01
      • 2011-02-11
      • 1970-01-01
      相关资源
      最近更新 更多