2014-02-07 61 views
0

我正在從隊列中選取一條XML消息,我需要使用從數據庫表上的Select語句返回的值更新XML消息。Mule中的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」 &然後發送郵件從數據庫中檢索的值進一步處理。

達到此目的的最佳方法是什麼?

回答

0
Groovy的

腳本組件用的XmlSlurper應該這樣做:

//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}) 
+0

安東,我用你的組件但是我仍然有問題。對於我將我的有效載荷從Byte []轉換爲String,然後調用Scripting組件。但是我得到的腳本組件無法被調用。此外,我將'parseText'方法更改爲'parse'以容納傳入的字符串。你認爲這些改變是否可以,或者我應該嘗試其他的東西?我擔心腳本組件無法被調用。 – insaneyogi

+0

對不起,我不太瞭解你的做法。你能澄清幷包含可能的錯誤信息嗎?帶String輸入的XmlSlurper parse()方法需要一個URI字符串,所以你需要使用parseText()和一個String有效載荷。 –

+0

不要緊,安東,在我介紹的代碼中有一個錯字。感謝它爲我提供的巨大幫助。欣賞它。 – insaneyogi