2

私は持っている:

<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 マーシャラーを使用して要素ノードを反復処理しようとしていましたが、@XmlRootElement 注釈がないため、型 "java.lang.String" を要素としてマーシャリングできないため、アイデアは失敗しました

また、私は使用しようとしていました

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

自分でメッセージを処理できることを望んでいましたが、毎回受信した oldMessage で null を取得しました。

あなたのアイデアを共有できますか?

「in」メッセージを何らかのプロパティとして保存し、分割してからカスタムプロセッサを通過すると、必要なものがすべて構築されますか? キャメルを使ったより良い解決策があることを願っています。ありがとう

アップデート。今、私は以前に尋ねた方法でこの機能を実装しました。(ヘッダーをプロパティとして保存し、分割し、メッセージを復元: 連結のように " + ヘッダー + 変換されたボディ +

しかし、追加のプロセッサ (分割前と分割後) ですべてのルートをラップする必要があります。それでも、私の問題は典型的で一般的なものであるべきだと思いますが、何かを見逃したと思います。

アップデート2. 2 つのプロセッサーを 1 つのスプリッター Bean に置き換え

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;
}
4

2 に答える 2

2

簡単な方法は、.to("xslt:").split().tokenizeXML("Message") のような tokenizeXML でキャメル分割を使用できる xslt を使用して xml を変換することです。

あなたの場合の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>
于 2016-03-07T01:37:28.130 に答える
1

ヘッダーマップにリンクするエクスチェンジにプロパティを追加するだけです。このプロパティはスプリッター内で使用できます。このようなもの:

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

スプリッター内では、キー「parentHeaders」でヘッダーを参照できます。

これがあなたを助けることを願っています

于 2013-01-30T13:46:29.290 に答える