Как именно работает это выражение XPATH, определенное для итеративного носителя WSO2? - PullRequest
0 голосов
/ 26 сентября 2018

Я изучаю шаблоны ESO WSO2, и у меня есть некоторые сомнения, читая официальную документацию шаблона splitter (https://docs.wso2.com/display/IntegrationPatterns/Splitter)

С теоретической точки зрения ясно, чтоУ меня есть некоторые сомнения по поводу реализации, предложенной примером.

Это определение прокси-сервера, содержащего последовательность, реализующую шаблон splitter :

<definitions xmlns="http://ws.apache.org/ns/synapse">
   <proxy name="SplitMessageProxy" transports="http https" startOnLoad="true">
      <target>
         <inSequence>
            <log level="full"/>
            <iterate xmlns:m0="http://services.samples"
                     preservePayload="true"
                     attachPath="//m0:getQuote"
                     expression="//m0:getQuote/m0:request">
               <target>
                  <sequence>
                     <send>
                        <endpoint>
                           <address uri="http://localhost:9000/services/SimpleStockQuoteService"/>
                        </endpoint>
                     </send>
                  </sequence>
               </target>
            </iterate>
         </inSequence>
         <outSequence>
            <drop/>
         </outSequence>
      </target>
      <publishWSDL uri="file:repository/samples/resources/proxy/sample_proxy_1.wsdl"/>
   </proxy>
   <sequence name="fault">
      <log level="full">
         <property name="MESSAGE" value="Executing default &#34;fault&#34; sequence"/>
         <property name="ERROR_CODE" expression="get-property('ERROR_CODE')"/>
         <property name="ERROR_MESSAGE" expression="get-property('ERROR_MESSAGE')"/>
      </log>
      <drop/>
   </sequence>
   <sequence name="main">
      <in/>
      <out/>
   </sequence>
</definitions>

Тогда это SOAP-запрос отправляется на прокси-сервер previus:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://services.samples" xmlns:xsd="http://services.samples/xsd">
   <soapenv:Header/>
   <soapenv:Body>
      <ser:getQuote>    
         <ser:request>          
            <xsd:symbol>IBM</xsd:symbol>
         </ser:request>
          <ser:request>           
            <xsd:symbol>WSO2</xsd:symbol>
         </ser:request>
         <ser:request>          
            <xsd:symbol>IBM</xsd:symbol>
         </ser:request>
      </ser:getQuote>
   </soapenv:Body>
</soapenv:Envelope>

Хорошо, поэтому посредник Iterate принимает каждый дочерний элемент элемента, указанного в его выражении XPath, и применяетпоток последовательности внутри посредника итератора ... так что в этом случае он выполняет итерацию по всем дочерним элементам XPATH-выражения , определяемого как: // m0: getQuote / m0: request , чтодолжен быть следующий тег XML:

<xsd:symbol>IBM</xsd:symbol>

и

<xsd:symbol>WSO2</xsd:symbol>

и

<xsd:symbol>IBM</xsd:symbol>

Сомнение в этом выражении XPATH:

выражение XPATH равно // m0: getQuote / m0: требуемыйй .Почему в этом примере он добавляет пространство имен m0 перед элементом XML?Почему выражение не является чем-то // ser: getQuote / ser: request (используя пространство имен, определенное внутри запроса XML, поступающего в поток ESB)?

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Это пространство имен имеет значение, префикс - это просто простой способ ссылки на ранее определенное пространство имен.

В запросе префикс ser определен как

xmlns:ser="http://services.samples"

В итерационном посреднике префикс m0 определен как

xmlns:m0="http://services.samples"

Что фактически используется при разрешенииВыражение XPATH - это пространство имен, поэтому оба они разрешат одно и то же.Префиксы не должны быть одинаковыми в разных документах, они действуют только внутри документа.Таким образом, префикс m0 ограничен прокси-сервером WSO2, а префикс ser специфичен для вашего запроса.

0 голосов
/ 29 октября 2018

Пространство имен m0, определенное в самом Iterate Mediator. xmlns: m0 = "http://services.samples" Вот почему мы используем его в Xpath. Префикс" m0 "не имеет значения, URI пространства имен имеет значение. Мы могли бы просто не знать, с каким префиксом будет приходить входящее сообщениеприбыть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...