私は持っている:
<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;
}