как использовать xpath в camel-context.xml, чтобы проверить, существует ли конкретный узел или нет

Я пытаюсь разработать приложение для верблюжьей маршрутизации на основе контента. Это приложение просмотрит папку src/data, чтобы увидеть, есть ли файл запроса SOAP с узлом <e2d:getOrderDetaiRequest>, затем этот файл будет скопирован в target/message, в противном случае файл будет скопирован в target/other.

Знаете ли вы, как использовать xpath (или любые другие инструменты) для проверки этого условия (я предпочитаю использовать файл camel-context.xml)?

Вот мой верблюжий контекст

<route>
        <from uri="file://c:/src/data?noop=true"/>
        <choice>
           <when>
            <xpath>**???????????????????????????**</xpath>
                <to uri="file://c:/target/message"/>
           </when>
           <otherwise>
            <to uri="file://c:/target/other"/>
           </otherwise>
        </choice>
    </route>

А вот пример двух разных запросов SOAP

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:e2d="http://www.abc.com/Abc11WS">
   <soapenv:Header/>
   <soapenv:Body>
      <e2d:getOrderDetailRequest>
         <actionCode>1234</actionCode>
      </..>
   </...></...>

А также

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:lsr="http://www.abc.com/Abc22WS">
   <soapenv:Header/>
   <soapenv:Body>
      <lsr:getProductDetailsRequest>
           <productId>12345</...>
     </...></...></...>

person David    schedule 08.03.2012    source источник


Ответы (1)


При использовании xpath и вашем xml есть пространства имен, такие как ваше сообщение SOAP, вы также должны использовать пространства имен в выражении xpath.

Некоторые подробности можно найти в документации Camel по адресу: http://camel.apache.org/xpath.

Используя XML DSL в Camel, вы можете напрямую объявить пространство имен в теге XML, например, в camelContext и т. д.

<camelContext xmlns="http://camel.apache.org/schema/spring" e2d="http://www.abc.com/Abc11WS">
   ...
   <when>
     <xpath>/e2d:getOrderDetailRequest</xpath>
       ...

Но имейте в виду, что XPath может быть немного сложно заставить работать правильно. И именно поэтому мы добавили logNamespaces в Camel 2.10. Подробнее см. внизу этой страницы: http://camel.apache.org/xpath.

person Claus Ibsen    schedule 09.03.2012
comment
Спасибо Ибсен. Я объявил e2d=abc.com/Abc11WS в теге CamelContext, но файл xml получил ошибку: cvc-complex -type.3.2.2: Атрибут «e2d» не может появляться в элементе «camelContext». - person David; 09.03.2012
comment
Вам нужно добавить объявление в это пространство имен в самом верху, например, есть объявление для Camel и т. д. Вам нужно то же самое для вашего пространства имен. например, стандартный материал xml/namespace. - person Claus Ibsen; 09.03.2012
comment
поэтому в теге beans: " rel="nofollow noreferrer">abc.com/Abc11WS xsi:schemaLocation=... abc. com/Abc11WS file://c:/.../etc/entertainment/abc11ws_schema1.xsd›. Но ошибка все равно есть. Извините, я плохо разбираюсь в этих xml/квалифицированных именах. - person David; 09.03.2012
comment
См. документацию по xpath на сайте Camel, раздел Использование конфигурации XML. Обратите внимание на пространство имен foo. - person Claus Ibsen; 10.03.2012
comment
Спасибо Ибсен. Я следовал документу. XML теперь в порядке. Но когда я запустил приложение. Это не сработало, как я ожидаю. Похоже, условие всегда получает ложное значение. вот файл журнала, который я получил: org.apache.camel.camel-core - 2.6.0 | #0 - XPath: /e2d:getOrderDetailRequest соответствует: false для: Exchange[Сообщение: [Body является экземпляром java.io.InputStream]] Endpoint[file://c:/target] Exchange[Сообщение: [Body является экземпляром java.io.InputStream]] Записал [c:\target\other\xxxxxxxx] в [Endpoint[file://c:/target/other]] - person David; 12.03.2012
comment
Возможно, вам придется выполнить ‹xpath›//e2d:getOrderDetailRequest‹/xpath›, чтобы указать xpath для поиска по всему дереву. Я сказал вам, что выражения XPath - это боль в .... Могут быть некоторые инструменты проверки xpath, которые вы можете попробовать, чтобы заставить их работать в первую очередь. - person Claus Ibsen; 12.03.2012
comment
Вау, Клаус. Вы мой спаситель. :-). Сейчас это работает. Еще раз, спасибо за ваше терпение, чтобы ответить на все мои вопросы. - person David; 13.03.2012
comment
Да хорошо. В доке не всегда просто уловить все тонкости сэмплов. Я просто думал, что xpath может угадать NS, но это не так. С объявлением NS в контексте верблюда все работает нормально. - person рüффп; 07.04.2017