解析Camel中的错误响应

时间:2013-07-19 22:20:29

标签: xpath apache-camel

Camel的新手,我正在尝试解析响应错误xml。在camel-context中,我需要确定错误文件中是否存在特定值,并以不同于其他错误的方式处理它。

其他错误使用一系列when语句:

<when>
    <xpath>/abc:ErrorResponse/abc:Error/abc:Message/.</xpath>
    <setHeader headerName="RESPONSE_STRING">
        <xpath resultType="java.lang.String">/abc:ErrorResponse/abc:Error/abc:Message/.</xpath>
    </setHeader>

    <setHeader headerName="MY_DATA_FIELD"><constant>Error</constant></setHeader>
    <to uri="def:doErrorStuff" pattern="InOnly"/>
</when>
<when>
    <xpath>/ghi:ErrorResponse/ghi:Error/ghi:Message/.</xpath>
        <setHeader headerName="RESPONSE_STRING">
            <xpath resultType="java.lang.String">/ghi:ErrorResponse/ghi:Error/ghi:Message/.</xpath>
        </setHeader>
        <setHeader headerName="MY_DATA_FIELD"><constant>Error</constant></setHeader>
        <to uri="def:doErrorStuff" pattern="InOnly"/>
</when>

我的错误XML文件有一个带有子“Code”元素的外部错误元素。我需要解析代码元素的值 更新:这是我所参与的XML

 <ErrorResponse xmlns="http://myhost/location1/">
    <Error>
        <Type>reserved</Type>
        <Code>TEXT_I_NEED_TO_PARSE_IN_WHEN_STATEMENT</Code>
    </Error>
    <RequestId>some_id</RequestId>
</ErrorResponse>

我使用了xpath和'simple'的组合来进行检查。像这样:

    <when>
        <xpath>/ghi:ErrorResponse/ghi:Error/ghi:Message/.</xpath>
        <when>
            <simple>${in.body.code} == 'StringIAmSearchingFor'</simple>
            <!-- Do Stuff --!>
        </when>
    </when>

但是,我没有得到我期望的答复 1.这种方法或语法有问题吗?
2.有没有办法在布局时将双重组合在一起,以便将它们组合在一起。否则,如果我在现有的两个语句之前添加“when”语句,则现有的“ghi”when语句将永远不会被执行(xpath语句匹配)。

1 个答案:

答案 0 :(得分:1)

  1. 您在输入中使用xpath表明它是XML,然后是简单的($ {in.body.code}),在这种情况下也是XML。 Simple用于遍历java主体,而不是其他格式,如XML。坚持使用XPATH - 上面的代码可以很容易地在xpath中实现。当然,另一种方法是使用xstreamjaxb将XML解组为java对象,然后你只能使用简单的/ OGNL / groovy或诸如此类的东西。

  2. 由于我建议你单独用xpath来解决这个问题,你当然可以同时使用xpath和operator和几个xpath表达式。骆驼选择/驻留在您正在使用的表达式语言中的所有逻辑和能力(简单或xpath),因此如果您想混合表达式语言,则必须构建一种decision tree。如果你试图实现非常复杂的路由逻辑,那实际上可能是件好事。对于一个特例 - 它是,恕我直言,只是凌乱。