2

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;

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

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>

有人可以帮我吗?

4

3 回答 3

6

这个计算模块应该做你需要的,在 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;

有几点需要注意,首先,重新定义自动生成的程序并不是一个好习惯,如果您需要重用设置消息中每个字段的功能,那么明智的做法是创建一个新程序来执行此操作。

XMLNS 也已被弃用,因此请改用 XMLNSC,它具有更高的性能并具有与仅支持遗留应用程序的 XMLNS 相同的功能。

于 2014-07-14T12:03:31.073 回答
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”这样多次赋值是没用的,你只需要一次。

于 2014-07-14T08:27:46.583 回答
0

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

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

于 2015-08-04T12:17:11.183 回答