2

XML メッセージの一部の内部部分を抽出することになっている Camel ルートを指定して、そこから新しいメッセージを作成して渡します。

 from(SUB_EXTRACT_XML)
   .setExchangePattern(ExchangePattern.InOut)
   .setBody().xpath("//mmsg:MyMessage/mmsg:AnyPayload/*", namespaces) 
   .setBody().simple("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n${in.body}")
   .to(...)

このような正しい入力メッセージ (「埋め込まれた」xml メッセージは、xs:any によってスキーマで定義された内部にあります) の場合、メッセージは私が期待するものであるため、機能しています:

<mmsg:MyMessage>
  <mmsg:RandomTags/>
   ...
   <mmsg:AnyPayload> <!-- xs:any in xsd -->
     <some><xml/><here/></some>
   </mmsg:AnyPayload>
</mmsg:MyMessage>

mmsg:AnyPayload タグが欠落しているなど、XML メッセージに問題があり、XPATH が機能しない場合:

<mmsg:MyMessage>
  <mmsg:RandomTags/>
   ...
   <some><xml/><here/></some>
</mmsg:MyMessage>

XPATH はデータの抽出に失敗し、XML メッセージ全体 (mmsg:MyMessage を含む) が渡されますが、これは意図したものではありません。この段階で例外をスローします。

質問:

xpath 式が実際にルートの後半で参照される要素を見つけたかどうか、または指定された要素の抽出に失敗したかどうかを確認する方法はありますか?

以前にメッセージのスキーマ検証を行って不要なメッセージを拒否できたことは知っていますが、XPath 式が失敗したかどうかを確認する方法はありますか?

4

1 に答える 1

0

choice()解決策は、次のようにルートで DSLを使用することです。

 from(SUB_EXTRACT_XML)
   .setExchangePattern(ExchangePattern.InOut)
   .choice()
        .when(xpath("//mmsg:MyMessage/mmsg:AnyPayload", namespaces))
            .setHeader("Status", "OK") // just for another example how to transmit some variable between two routes 
            .setBody().simple("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n${in.body}")
            .endChoice()
        .otherwise()
            .log(LoggingLevel.ERROR, "LoggerName", "Error message; Stop the processing")
            .stop()
        .endChoice()
    .end()
   // Just to show the headers are following the route... 
   .to("DIRECT_GO_FORWARD"); 



 from("DIRECT_GO_FORWARD")
   .setExchangePattern(ExchangePattern.InOut)
   .choice()
        .when(header("Status").isEqualTo("OK"))
            .bean(new SampleProcessor())

        ...
    .end()
    ...
    .to("...");

2 番目のルートは、最初のルートで設定されたヘッダー (および本文も) を使用できることを示すためのものです。

于 2014-08-06T19:43:52.640 に答える