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

时间:2014-07-11 10:51:51

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

Websphere Message Broker:File in File out示例。 我有一个带有重复元素结构的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;

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

SET OutputRoot.XMLNS.student[I].name = 'XYZ';

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

我的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>

有人可以帮我吗?

3 个答案:

答案 0 :(得分: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;

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

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

答案 1 :(得分:0)

我认为你的代码应该是这样的:

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

无法多次进行“OutputRoot = InputRoot”之类的分配,只需要一次。

答案 2 :(得分:0)

在解决这些类型的问题时尝试使用图形调试器,它允许您逐步执行ESQL代码并观察正在构建的树。您可以轻松地查看代码未按预期执行的操作。

https://www-01.ibm.com/support/knowledgecenter/SSMKHH_9.0.0/com.ibm.etools.mft.doc/ag11050_.htm