2016-09-28 72 views
0

過去幾個月來,我一直在研究Java模塊以轉換XML。例如,它應該接受一個soap請求並使用元數據存儲庫中的其他元素填充soap:header元素。該模塊應該普遍適用於任何中間件(我的本機系統是SAP PI)。IBM Integration Bus Java計算節點:輸出w3c.dom.Document或字符串

現在我的任務是將此模塊作爲jar實現到IBM Integration Bus中的JavaCompute節點中。問題是導出生成的XML我需要將數據導入JavaCompute節點的outMessage。但是,我沒有找到將org.w3c.com.Document轉換爲MbElement或將文檔或其內容插入MbElement的方法。

實際上,我沒有看到任何方法可以根據需要使用IBM API,所以我必須編寫代碼讀取已經完成的Document並構建MbElement(甚至不是XML字符串)從中。

這看起來如下:

public void evaluate(MbMessageAssembly inAssembly) throws MbException { 

    MbOutputTerminal out = getOutputTerminal("out"); 
    MbOutputTerminal alt = getOutputTerminal("alternate"); 

    MbMessage inMessage = inAssembly.getMessage(); 

    // create new empty message 
    MbMessage outMessage = new MbMessage(); 
    MbMessageAssembly outAssembly = new MbMessageAssembly(inAssembly, 
      outMessage); 

    try { 
     // optionally copy message headers 
     // copyMessageHeaders(inMessage, outMessage); 
     // ---------------------------------------------------------- 
     // Add user code below 

     //Create an example output Document 
     String outputContent = "<element><subelement>Value</subelement></element>"; 
     DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
     InputSource is = new InputSource(); 
     is.setCharacterStream(new StringReader(outputContent)); 
     Document outDocument = db.parse(is); 

//Get the Document or its content into the outRoot or outMessage somehow. 

MbElement outRoot = outMessage.getRootElement(); 

//Start to iterate over the Document and use Methods like this to build up the MbElement? 
MbElement outBody = outRoot.createElementAsLastChild("request"); 

// End of user code 
} catch (MbException e) { ... 
+0

你有什麼問題嗎?您是正確的,只能通過IBM API訪問傳出消息樹。 –

+0

問題是如果我能以某種方式自己不這樣做,並將DOM轉換爲outMessage可以處理的東西以及如何將它放入消息中。 siarheib可能有正確的答案,我正在測試它的ATM。 –

回答

0

你可以投你org.w3c.com.Document以字節數組(example)。然後你可以使用下面的代碼:

 MbMessage outMessage = new MbMessage(); 
     //copy message headers if required 
     MbElement oRoot = outMessage.getRootElement(); 
     MbElement oBody = oRoot.createElementAsLastChild(MbBLOB.PARSER_NAME); 
     oBody.createElementAsLastChild(MbElement.TYPE_NAME_VALUE, "BLOB", yourXmlAsByteArray); 
     MbMessageAssembly outAssembly = new MbMessageAssembly(inAssembly, inAssembly.getLocalEnvironment(), inAssembly.getExceptionList(), outMessage); 
+0

有趣的是,我會試試看看下一個節點如何處理BLOB對象。 Afaik雖然是一種常見的內容格式。 –

+0

正確答案。對於將來的讀者:BLOB可以用於像「普通」xml這樣的後續節點,我已經將它直接放到FileOutputNode中,它就像我在Code中生成它一樣。 –

+0

只是一小部分。如果要將以下節點中的消息用作XML(換句話說,使用Integration Bus功能瀏覽消息結構),則可以使用ResetContentDescriptor節點將BLOB重新分解爲XMLNSC。 – siarheib

相關問題