【问题标题】:Unable to generate repeating XML element root nodes using XMLNS in IBM Integration Bus无法在 IBM Integration Bus 中使用 XMLNS 生成重复的 XML 元素根节点
【发布时间】:2019-05-19 13:05:34
【问题描述】:

我正在尝试在 IBM 集成总线中为我的 soap Web 服务创建响应。我正在使用 ESQL 计算节点使用 XMLNS 生成 XML。我必须在我的 xml 中添加一些重复的元素根节点,这就是我面临的问题。

DECLARE tnsp NAMESPACE '...';

SET OutputRoot.XMLNS.Response.(XML.NamespaceDecl)xmlns:acc = tnsp;
SET OutputRoot.XMLNS.Response.tnsp:ReqID = 'ID102';
SET OutputRoot.XMLNS.Response.tnsp:CompanyName = 'Example';

SET OutputRoot.XMLNS.Response.tnsp:Employee.tnsp:id = 'E100';
SET OutputRoot.XMLNS.Response.tnsp:Employee.tnsp:name = 'John';

这给了

<Response xmlns:acc="...">
    <acc:ReqID>ID102</acc:ReqID>
    <acc:CompanyName>Example</acc:CompanyName>
    <acc:Employee>
        <acc:id>E100</acc:id>
        <acc:name>John</acc:name>
    </acc:Employee>
</Response>

我想添加更多员工节点,比如

<Response xmlns:acc="...">
    <acc:ReqID>ID102</acc:ReqID>
    <acc:CompanyName>Example</acc:CompanyName>
    <acc:Employee>
        <acc:id>E100</acc:id>
        <acc:name>John</acc:name>
    </acc:Employee>
    <acc:Employee>
        <acc:id>E101</acc:id>
        <acc:name>Alex</acc:name>
    </acc:Employee>
    .
    .
    .
</Response>

我怎样才能做到这一点?我尝试重复添加员工节点的代码,但它正在替换现有的并输出最后更新的。

【问题讨论】:

    标签: xml soap ibm-integration-bus extended-sql


    【解决方案1】:

    可以通过将Employeenode做成一个数组来实现

    SET OutputRoot.XMLNS.Response.tnsp:Employee[1].tnsp:id = 'E100';
    

    【讨论】:

      【解决方案2】:

      另一种选择,通常在性能方面更可取,是使用 CREATE 和 REFERENCE。我创建了一个简单的测试流程。

      Transform ComputeNode 包含以下代码。

      BROKER SCHEMA com.nsd
      
      CREATE COMPUTE MODULE Transform
      CREATE FUNCTION Main() RETURNS BOOLEAN
      BEGIN
          -- Declare the namespaces we want to use
          DECLARE acc NAMESPACE 'http://acc';    
          DECLARE soap NAMESPACE 'http://schemas.xmlsoap.org/soap/envelope/';
      
          -- Create the SOAP aggregate assigning the SOAP parser by using DOMAIN 'SOAP'
          CREATE LASTCHILD OF OutputRoot DOMAIN 'SOAP';
      
          -- By using the following statements to create elements in the SOAP.Context subtree
          -- our output will use namespace prefixes of soap and acc rather than NS1 and NS2
          SET OutputRoot.SOAP.Context.Namespace.(SOAP.NamespaceDecl)xmlns:soap = soap;
          SET OutputRoot.SOAP.Context.Namespace.(SOAP.NamespaceDecl)xmlns:acc = acc;
      
          -- Create the main Response aggregate inside the SOAP.Body
          DECLARE ResponseRefOut REFERENCE TO OutputRoot;
          CREATE LASTCHILD OF OutputRoot.SOAP.Body AS ResponseRefOut NAMESPACE acc NAME 'Response';
      
          -- Add the non repeating aggregate field
          DECLARE EmployeeListRefIn REFERENCE TO InputRoot.SOAP.Body.employeeList;
          SET ResponseRefOut.acc:ReqID = 'ID' || EmployeeListRefIn.requestId;
          SET ResponseRefOut.acc:CompanyName = EmployeeListRefIn.company;
      
          -- Loop through the employee's in the input creating Employee aggregates in the output
          DECLARE EmployeeRefOut REFERENCE TO OutputRoot;
          DECLARE EmployeeRefIn REFERENCE TO EmployeeListRefIn.employee;
          WHILE LASTMOVE(EmployeeRefIn) DO
              CREATE LASTCHILD OF ResponseRefOut AS EmployeeRefOut NAMESPACE acc NAME 'Employee';
      
              SET EmployeeRefOut.acc:id = EmployeeRefIn.id;
              SET EmployeeRefOut.acc:name = EmployeeRefIn.firstName;
      
              MOVE EmployeeRefIn NEXTSIBLING REPEAT NAME;
          END WHILE;
      
          RETURN TRUE;
      END;
      END MODULE;
      

      以及以下输入数据来测试它。

      <?xml version="1.0"?>
      <soap:Envelope
          xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
          <soap:Header/>
          <soap:Body>
              <employeeList>
                  <requestId>102</requestId>
                  <company>Universal Happiness</company>
                  <employee>
                      <id>E100</id>
                      <firstName>John</firstName>
                  </employee>
                  <employee>
                      <id>E101</id>
                      <firstName>Peter</firstName>
                  </employee>
                  <employee>
                      <id>E102</id>
                      <firstName>Paul</firstName>
                  </employee>
              </employeeList>
          </soap:Body>
      </soap:Envelope>
      

      这显示了 Trace 节点配置的样子。

      它产生以下输出。
      请注意已附加到元素树的三个解析器,其格式为 [{ParserName} : {ParserInstance}]。即 SOAPRoot、MQPROPERTYPARSER 和 SOAP。

      Trace showing the content of the response message
      
      ( ['SOAPRoot' : 0x1b633e9ff60]
        (0x01000000:Name  ):Properties = ( ['MQPROPERTYPARSER' : 0x1b406434d80]
          (0x03000000:NameValue):MessageSet             = NULL
          (0x03000000:NameValue):MessageType            = NULL
          (0x03000000:NameValue):MessageFormat          = NULL
          (0x03000000:NameValue):Encoding               = NULL
          (0x03000000:NameValue):CodedCharSetId         = NULL
          (0x03000000:NameValue):Transactional          = NULL
          (0x03000000:NameValue):Persistence            = NULL
          (0x03000000:NameValue):CreationTime           = NULL
          (0x03000000:NameValue):ExpirationTime         = NULL
          (0x03000000:NameValue):Priority               = NULL
          (0x03000000:NameValue):ReplyIdentifier        = NULL
          (0x03000000:NameValue):ReplyProtocol          = 'SOAP-AXIS2' (CHARACTER)
          (0x03000000:NameValue):Topic                  = NULL
          (0x03000000:NameValue):ContentType            = NULL
          (0x03000000:NameValue):IdentitySourceType     = NULL
          (0x03000000:NameValue):IdentitySourceToken    = NULL
          (0x03000000:NameValue):IdentitySourcePassword = NULL
          (0x03000000:NameValue):IdentitySourceIssuedBy = NULL
          (0x03000000:NameValue):IdentityMappedType     = NULL
          (0x03000000:NameValue):IdentityMappedToken    = NULL
          (0x03000000:NameValue):IdentityMappedPassword = NULL
          (0x03000000:NameValue):IdentityMappedIssuedBy = NULL
        )
        (0x01000000:Folder):SOAP       = ( ['SOAP' : 0x1b62a218430]
          (0x01000000:Folder):Context = (
            (0x01000000:Folder):Namespace = (
              (0x03000102:NamespaceDecl)xmlns:soap = 'http://schemas.xmlsoap.org/soap/envelope/' (CHARACTER)
              (0x03000102:NamespaceDecl)xmlns:acc  = 'http://acc' (CHARACTER)
            )
          )
          (0x01000000:Folder):Body    = (
            (0x01000000:Folder)http://acc:Response = (
              (0x03000000:PCDataField)http://acc:ReqID       = 'ID102' (CHARACTER)
              (0x03000000:PCDataField)http://acc:CompanyName = 'Universal Happiness' (CHARACTER)
              (0x01000000:Folder     )http://acc:Employee    = (
                (0x03000000:PCDataField)http://acc:id   = 'E100' (CHARACTER)
                (0x03000000:PCDataField)http://acc:name = 'John' (CHARACTER)
              )
              (0x01000000:Folder     )http://acc:Employee    = (
                (0x03000000:PCDataField)http://acc:id   = 'E101' (CHARACTER)
                (0x03000000:PCDataField)http://acc:name = 'Peter' (CHARACTER)
              )
              (0x01000000:Folder     )http://acc:Employee    = (
                (0x03000000:PCDataField)http://acc:id   = 'E102' (CHARACTER)
                (0x03000000:PCDataField)http://acc:name = 'Paul' (CHARACTER)
              )
            )
          )
        )
      )
      

      【讨论】:

      • 感谢您的回复先生。我已经尝试过您的代码,但收到错误“BIP2291E:根元素名称“响应”的解析器类名称没有常量。集成节点找不到用于根元素名称的解析器类名称的常量。这适用于 XMLNS 吗?
      • 对不起,我只展示了一个片段。您获得 BIP2291E 的原因是 IIB 搜索树以查找要使用的解析器的名称。我不是 100% 确定它为什么在您的代码示例中附加 XMLNS 解析器。无论如何,我故意通过指定 DOMAIN 'XMLNS' 来强制它使用 XMLNS 解析器。希望现在这对您有用。
      • 顺便说一句,您可以在计算节点后立即连接 TRACE 节点,将其配置为写入文件并指定 ${Root},它将写出包含解析器名称的树使用。
      • 谢谢大佬回复,还是不行!跟踪节点没有向文件写入任何内容。
      • 顺便说一句,由于 Trace 节点保持文件打开,您可能需要停止并重新启动应用程序,然后才能看到 Trace 节点的输出。
      猜你喜欢
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 2014-10-26
      • 1970-01-01
      • 1970-01-01
      • 2014-10-26
      • 1970-01-01
      • 2023-03-24
      相关资源
      最近更新 更多