【问题标题】:XML Mapping in MuleMule 中的 XML 映射
【发布时间】:2014-03-05 07:20:30
【问题描述】:

我有一条从队列中挑选出来的 XML 消息,我需要使用从数据库表上的 Select 语句返回的值来更新 XML 消息。

所以最初我将 XML 有效负载保存到一个单独的变量中。然后我发出数据库调用,将值保存在局部变量中,然后重置有效负载变量。

 //Save Payload
 <set-variable variableName="tempPayload" value="#[message.payload]" doc:name="Variable"/>

  //Database Operation     
        <jdbc-ee:outbound-endpoint exchange-pattern="request-response"  queryTimeout="-1" connector-ref="Database" doc:name="GetInformation" queryKey="Select Data"> 
            <jdbc-ee:query key="Select Data" value="SELECT address, city, zip,state, country, phone, email,org  FROM Details  WHERE id = "100" />

        </jdbc-ee:outbound-endpoint>  

        <set-variable doc:name="address1" value="#[message.payload[0].address]" variableName="address1"></set-variable> 
        <set-variable doc:name="city" value="#[message.payload[0].city]" variableName="city"></set-variable> 
        <set-variable doc:name="zip" value="#[message.payload[0].zip
]" variableName="zip"></set-variable>
        <set-variable doc:name="state" value="#[message.payload[0].state]" variableName="state"></set-variable>
        <set-variable doc:name="country" value="#[message.payload[0].country]" variableName="country"></set-variable>
        <set-variable doc:name="phone" value="#[message.payload[0].phone]" variableName="phone"></set-variable>
        <set-variable doc:name="email" value="#[message.payload[0].email]" variableName="email"></set-variable>
        <set-variable doc:name="org" value="#[message.payload[0].org]" variableName="org"></set-variable>

        //Reset Payload

        <set-payload value="#[tempPayload]" doc:name="Set Payload"/>

现在我的原始有效载荷格式为:

<Order xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:noNamespaceSchemaLocation="">
   <TransactionId>376721</TransactionId>
   <TransactionDateTime>2014-01-30T00:00:00</TransactionDateTime>

   <Parties>
      <Party>
         <PartyType>abcd</PartyType>
         <PartyCode></PartyCode>
         <FirstName></FirstName>
         <LastName></LastName>
         <CompanyName></CompanyName>
         <Address1></Address1>
         <CityName></CityName>
         <StateOrProvinceCode></StateOrProvinceCode>
         <PostalCode></PostalCode>
         <CountryCode></CountryCode>
         <PhoneNumber></PhoneNumber>
         <EmailAddress></EmailAddress>
      </Party>
      <Party>
         <PartyType>adfa</PartyType>
         <FirstName></FirstName>
         <Address1></Address1>
         <Address2></Address2>
         <CityName></CityName>
         <StateOrProvinceCode></StateOrProvinceCode>
         <PostalCode></PostalCode>
         <CountryCode></CountryCode>
         <EmailAddress></EmailAddress>
      </Party>
      <Party>
         <PartyType>XXXXXXX</PartyType>
         <Address/>
         <City/>
         <Zip/>
         <State/>
         <Country/>
         <Phone/>
         <Email/>
         <Org/>
      </Party>
      <Party>

      </Party>
   </Parties>
   <Items>
      <Item>

      </Item>
   </Items>
</Order>
</code>

我想将从数据库中检索到的值设置为特定方类型“XXXXXXX”,然后进一步发送消息进行处理。

实现这一目标的最佳方法是什么?

【问题讨论】:

    标签: xml database jdbc mule


    【解决方案1】:

    带有 XmlSlurper 的 Groovy 脚本组件应该可以做到:

    //parse
    records = new XmlSlurper(false,false).parseText(payload)
    //find Party with type XXXXXXXX
    party = records.Parties.Party.find { e -> e.PartyType.text().equals('XXXXXXX') }
    //set data
    party.Zip.replaceBody(flowVars['zip'])
    party.City.replaceBody(flowVars['city'])
    //rebuild the xml
    import groovy.xml.XmlUtil
    import groovy.xml.StreamingMarkupBuilder
    streamingMarkupBuilder=new StreamingMarkupBuilder()
    result = XmlUtil.serialize(streamingMarkupBuilder.bind{mkp.yield records})
    

    【讨论】:

    • Anton,我使用了你的组件,但我仍然遇到问题。一方面,我将我的有效负载从 Byte[] 转换为 String,然后调用 Scripting 组件。但是我得到脚本组件无法被调用。此外,我将“parseText”方法更改为“parse”以适应传入的字符串。您认为这些更改可以吗,还是我应该尝试其他方法?我担心脚本组件无法被调用。
    • 对不起,我不太明白你的做法。你能澄清并包括可能的错误信息吗?带有字符串输入的 XmlSlurper parse() 方法需要一个 URI 字符串,因此您需要使用带有字符串负载的 parseText()。
    • 别管安东,我介绍的代码中有错字。感谢它提供了我预期的输出的巨大帮助。欣赏它。
    • Anton 我的一个后续问题是是否也可以根据某些条件从 XML 中删除标签?在上面的 XML 中,我正在搜索一个标签并添加其他数据,但是如果我想从 XML 中完全删除一个标签。这也可行吗?
    • 是的,有可能。有一个名为 replaceNode 的方法,您可以在匹配的节点上调用该方法,并使用空闭包:replaceNode{}。我建议您查找一些有关 Groovy XmlSlurper 的文档/示例,并安装 Groovy Shell,以便您可以试验这些方法并交互式遍历。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    相关资源
    最近更新 更多