Websphere Message Broker:访问ESQL中的XML元素

Neh*_*aje 2 xml messagebroker ibm-integration-bus ibm-mq extended-sql

Websphere Message Broker:文件输出示例中的文件.我有一个带有重复元素结构的XML文件.如何在ESQL中访问和修改特定元素的值.我按照以下代码行事

CREATE PROCEDURE CopyEntireMessage() BEGIN
     --SET OutputRoot = InputRoot;
      DECLARE I INTEGER 1;
      DECLARE J INTEGER;
      SET J = CARDINALITY(OutputRoot.*[]);
      WHILE I < J DO
         SET OutputRoot = InputRoot;
         SET OutputRoot.XMLNS.person.student[I].name = 'XYZ';
         SET I = I + 1;
      END WHILE;
 END;
Run Code Online (Sandbox Code Playgroud)

但它不起作用.从输入文件夹中提取文件但我在Output文件夹中看不到任何内容.但如果我评论

SET OutputRoot.XMLNS.student[I].name = 'XYZ';
Run Code Online (Sandbox Code Playgroud)

然后文件在输出文件夹中可用,因为它没有任何变化.

我的XML文件如下

<person>
 <student>
   <name>ABC</name>
   <age>20</age>
   <address>city1</address>
 </student>
 <student>
   <name>PQR</name>
   <age>20</age>
   <address>city2</address>
 </student>
</person>
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮我吗?

小智 5

这个计算模块应该做你需要的,在linux上测试9001:

CREATE COMPUTE MODULE FileInputOutput_Compute
    CREATE FUNCTION Main() RETURNS BOOLEAN
    BEGIN
        -- CALL CopyMessageHeaders();
        CALL CopyEntireMessage();

        FOR source AS OutputRoot.XMLNSC.person.student[] DO
            SET source.name = 'XYZ';
        END FOR;


        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 CopyEntireMessage() BEGIN
        SET OutputRoot = InputRoot;
    END;
END MODULE;
Run Code Online (Sandbox Code Playgroud)

一些注意事项,首先重新定义自动生成的过程并不是一个好习惯,如果您需要重用设置消息中每个字段的功能,那么创建一个新的过程是明智的.

XMLNS也被弃用,因此使用XMLNSC,它具有更高的性能,并且具有与XMLNS相同的所有功能,仅保留用于支持遗留应用程序的XMLNS.