2012-12-20 67 views
2

我:駱駝分割XML保持一些節點

<Message> 
    <Header> 
    .....some more nodes..... 
    </Header> 

    <Element> 
    .....some more nodes..... 
    </Element> 

    <Element> 
    .....some more nodes..... 
    </Element> 
    .....more Element nodes...... 
</Message> 

我想通過節點元素分裂,但保留消息(頭)的其餘部分包括每個消息中。例如使用此XML我想獲得2等,它看起來像:

<Message> <!--root node is alive --> 
    <Header> <!--header included in every message --> 
    .....some more nodes..... 
    </Header> 

    <Element> <!--only one --> 
    .....some more nodes..... 
    </Element> 
</Message> 

使用分配器我只能得到:

<Element> 
    .....some more nodes..... 
    </Element> 

我試圖用JAXB封送遍歷元素節點,但這個想法失敗,原因是:不能編組類型「java.lang.String中」爲元素,因爲它缺少一個@XmlRootElement註釋

另外,我試圖用

.split(xpath("//Element"), new MyAgreggatorStrategy()) 

希望我可以自己處理消息,但每次收到的oldMessage都會得到空值。

你能分享你的想法嗎?

如果我將「in」消息存儲爲某種格式,然後進行拆分然後通過定製處理器將構造我需要的所有東西?我希望,駱駝有更好的溶劑。 謝謝

更新。現在我已經實現了這個功能,就像我之前問的那樣。 (存儲標題作爲屬性,使分裂,恢復消息:像串接「+標題+轉換體+

但我必須包裹我的額外的處理器(分裂之前和之後)所有我的路線。Stil認爲我的問題應該是典型和普遍,我想我錯過了一些東西。

UPDATE2。 更換2個處理器,1個分流豆

public String[] splitBody(Exchange exchange) { 
    String header = XPathBuilder.xpath("//Header").evaluate(exchange, String.class); 
    String element = XPathBuilder.xpath("//Element").evaluate(exchange, String.class); 

    String[] arr = element.split("</Element>"); 
    for (int i = 0; i < arr.length; i++) { 
     arr[i] = "<Message>" + header + arr[i] + "</Message>"; 
    } 
    return arr; 
} 
+1

我想正是這樣做,在過去也沒有找到很多搜索後,任何現成的組件。由於我正在處理大量消息,我最終使用stax編寫了一個自定義組件,該stax足以處理任何類型的消息。我認爲定製解決方案是這裏的一種方式。 –

+0

是的,幸運的是現成的分配器現在還不足以配置 – user1424119

回答

1

你可以只添加屬性,將鏈接到你的標題地圖的交流。這個屬性將是可用於分配器內。 類似這個:

 <setProperty propertyName="parentHeaders"> 
      <simple>${headers}</simple> 
     </setProperty> 

和內部拆分器,你可以通過鍵「parentHeaders」引用標題。

希望這將幫助你

+0

我會嘗試,這可以簡化一些事情。謝謝! – user1424119

1

簡單的方法是使用XSLT,然後可以使用駱駝分裂與tokenizeXML一樣。要(「XSLT」)來轉換XML。分裂()tokenizeXML(「消息「)

XSL爲您的情況:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" indent="yes" /> 
    <xsl:template match="/"> 
     <Messages> 
      <xsl:call-template name="Message" /> 
     </Messages> 
    </xsl:template> 
    <xsl:template name="Message" match="/Message"> 
     <xsl:for-each select="/Message/Element"> 
      <Message> 
       <xsl:copy-of select="/Message/Header"></xsl:copy-of> 
       <xsl:copy-of select="."></xsl:copy-of> 
      </Message> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet>