Как установить значение элемента в атрибут xml в esql outputroot - PullRequest
0 голосов
/ 04 сентября 2018

Я пытаюсь создать XML-файл, используя вычислительный узел. Мое требование заключается в создании следующего XML-документа

   <soapenv:Envelope>
      <soapenv:Body>
         <man:request domain="My-Dom">
            <man:b2b-query-metadata>
               <man:query>
                  <man:query-condition evaluation="property-greater-than">
                     <man:property-name>InputTime</man:property-name>
                     <man:value>2018-08-10 00:00:00</man:value>
                  </man:query-condition>
               </man:query>
               <man:result-constraints>
                  <man:sort-order>
                     <man:property-name direction="asc">InputTime</man:property-name>
                  </man:sort-order>
               </man:result-constraints>
            </man:b2b-query-metadata>
         </man:request>
      </soapenv:Body>
   </soapenv:Envelope>

Ниже приведен фрагмент, который используется для создания необходимого XML-документа.

CREATE COMPUTE MODULE FLOW_Compute

       CREATE FUNCTION Main() RETURNS BOOLEAN

       BEGIN
              CALL CopyMessageHeaders();
              CALL CreateSOAPReq();
              RETURN TRUE;
       END;

       CREATE PROCEDURE CopyMessageHeaders() BEGIN

              DECLARE I INTEGER 1;
              DECLARE J INTEGER;
              SET J = CARDINALITY(InputRoot.*[]);

              WHILE I < J DO
                     SET OutputRoot.*[I] = InputRoot.*[I];
                     SET I = I + 1;
              END WHILE;

       END;

              CREATE PROCEDURE CreateSOAPReq() BEGIN       

              DECLARE soapenv NAMESPACE 'http://schemas.xmlsoap.org/soap/envelope/';
              DECLARE man NAMESPACE 'http://www.datapower.com/schemas/management';   

              SET OutputRoot.HTTPRequestHeader.POST = 'https://my.testbox.com:5550/service/mgmt/3.0'; 
              SET OutputRoot.HTTPRequestHeader."Content-Type" = 'text/xml;charset=UTF-8';
              SET OutputRoot.HTTPRequestHeader."Authorization" = 'Basic '||base64Encode(CAST('myuserid:mypassword' as BLOB CCSID InputRoot.Properties.CodedCharSetId));
              SET OutputRoot.HTTPRequestHeader.Host = 'my.testbox.com:5550';

              SET OutputRoot.XMLNSC.soapenv:Envelope.soapenv:Body.man:request.(XMLNSC.Attribute)man:domain = 'My-Dom';
              SET OutputRoot.XMLNSC.soapenv:Envelope.soapenv:Body.man:request.man:"b2b-query-metadata".man:query.man:"query-condition".evaluation = 'property-greater-than';
              SET OutputRoot.XMLNSC.soapenv:Envelope.soapenv:Body.man:request.man:"b2b-query-metadata".man:query.man:"query-condition".man:"property-name" = 'InputTime';
              SET OutputRoot.XMLNSC.soapenv:Envelope.soapenv:Body.man:request.man:"b2b-query-metadata".man:query.man:"query-condition".man:value = '2018-08-10 00:00:00';  
              --SET OutputRoot.XMLNSC.soapenv:Envelope.soapenv:Body.man:request.man:"b2b-query-metadata".man:"result-constraints".man:"sort-order".man:"property-name".(XMLNSC.Attribute)man:direction = 'asc';          
       END;

END MODULE;

Обновление: После успешного устранения препятствия, когда я смог получить следующий элемент xml: <man:request domain="My-Dom">, используя следующее выражение SET OutputRoot.XMLNSC.soapenv:Envelope.soapenv:Body.man:request.(XMLNSC.Attribute)man:domain = 'B2B-Dev';, я поражен этой частью: <man:property-name direction="asc">InputTime</man:property-name>

Я попытался отсканировать примеры, в которых мы создаем outputroot с нуля, однако большинство примеров имеют дело с анализом входящего контента: https://www.ibm.com/support/knowledgecenter/en/SSKM8N_8.0.0/com.ibm.etools.mft.doc/ac67241_.htm

Я понимаю, что у нас есть атрибуты, которым необходимо присвоить значение элемента. Я не уверен, что делать дальше. Может кто-нибудь указать мне на пример, который включает в себя команду SET в esql.

Любые предложения приветствуются.

Ответы [ 3 ]

0 голосов
/ 10 сентября 2018

Вот разбивка того, с чем я столкнулся до сих пор.

  1. полагался исключительно на Flow exerciser, должен был периодически проверять содержимое очереди.
  2. изменение OutputRoot.XMLNSC.soapenv:Envelope.soapenv:Body.man:request.(XMLNSC.Attribute)man:domain = 'My-Dom';, разрешено, и я получаю желаемый результат, когда узел MQ Output размещен перед узлом Compute.

Спасибо @Attila Repasi за указание на недостатки в моем коде esql. :)

0 голосов
/ 06 мая 2019

Попробуйте перевернуть назначения.

Предполагается, что ниже приведен XML

<NS1:Envelope xmlns:NS1="http://schemas.xmlsoap.org/soap/envelope/">
   <NS1:Header/>
   <NS1:Body>
      <NS2:request domain="default" xmlns:NS2="http://www.datapower.com/schemas/management">
         <NS2:set-file name="local:///Phase1/tullu">UGlzdGFzaW5naA==</NS2:set-file>
      </NS2:request>
   </NS1:Body>
</NS1:Envelope>

Ниже приведен ESQL

SET OutputRoot.XMLNSC.ns21:Envelope.ns21:Body.ns39:request.(XMLNSC.Attribute)domain = datapowerDomain;
SET OutputRoot.XMLNSC.ns21:Envelope.ns21:Body.ns39:request.ns39:"set-file"=InputRoot.XMLNSC.ns:createFileRequest.directoryDetails.fileContentsInBase64;     
SET OutputRoot.XMLNSC.ns21:Envelope.ns21:Body.ns39:request.ns39:"set-file".(XMLNSC.Attribute)name=targetFQFileName;
0 голосов
/ 04 сентября 2018

Это не обычный атрибут XML - это объявление пространства имен. Вам нужно объявить константу пространства имен, а затем использовать ее в вашем ESQL, как описано здесь:

https://www.ibm.com/support/knowledgecenter/en/SSMKHH_10.0.0/com.ibm.etools.mft.doc/ac67194_.htm

...