如何在esql outputroot中将元素值设置为xml属性

时间:2018-09-04 14:59:39

标签: messagebroker ibm-integration-bus extended-sql

我正在尝试使用计算节点创建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;

更新: 在成功清除障碍之后,我可以使用以下语句<man:request domain="My-Dom">获得以下xml元素: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

我了解我们拥有一些属性,需要为其分配元素值。我不确定如何进行此操作。有人可以指出一个涉及esql中的SET命令的示例。

欢迎任何建议。

3 个答案:

答案 0 :(得分:0)

这不是普通的XML属性-它是名称空间声明。 您需要声明一个名称空间常量,然后按如下所述在您的ESQL中使用它:

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

答案 1 :(得分:0)

以下是我到目前为止所面临的问题。

  1. 仅依赖于Flow练习器,应该不时检查队列内容。
  2. 更改OutputRoot.XMLNSC.soapenv:Envelope.soapenv:Body.man:request.(XMLNSC.Attribute)man:domain = 'My-Dom';,已解决,当将MQ Output节点放在Compute节点的前面时,我得到了期望的结果。

感谢@Attila Repasi在我的esql代码中指出了这些缺陷。 :)

答案 2 :(得分:0)

尝试翻转作业。

假设下面是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;