2013-07-19 3 views
1

Новое в Camel, и я пытаюсь проанализировать ошибку ответа xml. В контексте camel мне нужно определить, существует ли определенное значение в файле ошибки и обрабатывать его иначе, чем другие ошибки.Отзыв об ошибке в Camel

Другие ошибки используют серию, когда заявления:

<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 имеет внешний элемент ошибки с дочерним элементом «Код». Мне нужно разобрать значение кода элемента UPDATE: ВОТ XML I AM PARSING

<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 и «простой», чтобы сделать чек. Например:

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

Тем не менее, я не получаю ответ, которого я ожидаю.
1. Что-то не так с этим подходом или синтаксисом?
2. Есть ли способ объединить двойной при компоновке, чтобы они были вместе и вместе. В противном случае, если я добавлю свой оператор «когда» только перед существующими двумя, существующий оператор «ghi» when никогда не будет выполнен (утверждения xpath совпадают).

+0

Пожалуйста, разместите пример ввода. –

+0

@Jens - не проблема, отправил xml – Tyrian

ответ

1
  1. Вы используете XPath на своем входе предполагая, что это XML, то просто ($ {in.body.code}), который в этом случае также будет XML. Простой используется для перемещения объектов java, а не других форматов, таких как XML. Придерживайтесь XPATH полностью - ваш код выше может быть легко реализован в xpath. Другим способом, конечно же, было бы развязать XML в java-объекты, используя xstream или jaxb, тогда вы можете использовать только простые/OGNL/groovy или еще что-то еще.

  2. Поскольку я рекомендую вам решить этот самый случай только с помощью xpath, вы можете, конечно, использовать xpath и operator to и несколько выражений xpath вместе. Вся логика и сила в выборе верблюда/когда вы находитесь на языке выражений, который вы используете (будь то простой или xpath), поэтому, если вы хотите смешивать языки выражений, вам нужно создать своего рода decision tree. Это может быть что-то хорошее, если вы пытаетесь реализовать очень сложную логику маршрутизации. Для одного особого случая - это, ИМХО, просто грязно.

+0

Спасибо за отличный ответ. Я попробую использовать один xpath до значения элемента «Код» и сравнить его с строкой, которую я ищу. Не уверен, как это будет выглядеть, но я буду играть с ним. – Tyrian

Смежные вопросы