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语句匹配)。
答案 0 :(得分:1)
您在输入中使用xpath表明它是XML,然后是简单的($ {in.body.code}),在这种情况下也是XML。 Simple用于遍历java主体,而不是其他格式,如XML。坚持使用XPATH - 上面的代码可以很容易地在xpath中实现。当然,另一种方法是使用xstream或jaxb将XML解组为java对象,然后你只能使用简单的/ OGNL / groovy或诸如此类的东西。
由于我建议你单独用xpath来解决这个问题,你当然可以同时使用xpath和operator和几个xpath表达式。骆驼选择/驻留在您正在使用的表达式语言中的所有逻辑和能力(简单或xpath),因此如果您想混合表达式语言,则必须构建一种decision tree。如果你试图实现非常复杂的路由逻辑,那实际上可能是件好事。对于一个特例 - 它是,恕我直言,只是凌乱。