WebSphereMessageBroker:在ESQL中访问XML元素

WebSphereMessageBroker:在ESQL中访问XML元素,xml,ibm-mq,messagebroker,ibm-integration-bus,extended-sql,Xml,Ibm Mq,Messagebroker,Ibm Integration Bus,Extended Sql,WebSphereMessageBroker:文件输入文件输出示例。 我有一个具有重复元素结构的XML文件。如何访问和修改ESQL中特定元素的值。 我输入以下代码 CREATE PROCEDURE CopyEntireMessage() BEGIN --SET OutputRoot = InputRoot; DECLARE I INTEGER 1; DECLARE J INTEGER; SET J = CARDINALITY(OutputRoot.*

WebSphereMessageBroker:文件输入文件输出示例。 我有一个具有重复元素结构的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;
然后,文件在输出文件夹中按原样可用,无需任何更改

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

基础知识
20
城市1
PQR
20
城市2

有人能帮我吗?

我想你的代码应该是这样的:

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;
创建过程CopyEntireMessage()开始
设置OutputRoot=InputRoot;
声明I为整数1;
声明J整数;
SET J=基数(OutputRoot.XMLNS.person.*[]);
而我是
设置OutputRoot.XMLNS.person.student[I].name='XYZ';
设置I=I+1;
结束时;
结束;

多次执行“OutputRoot=InputRoot”这样的赋值是没有用的,您只需要一次。

此计算模块应该满足您的需要,在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;
创建计算模块文件输入输出\u计算
CREATE函数Main()返回布尔值
开始
--调用CopyMessageHeaders();
调用CopyEntireMessage();
对于源,作为OutputRoot.XMLNSC.person.student[]DO
设置source.name='XYZ';
结束于;
返回TRUE;
结束;
创建过程CopyMessageHeaders()开始
声明I为整数1;
声明J整数;
集合J=基数(InputRoot.[]);
而我是
设置OutputRoot.*[I]=InputRoot.*[I];
设置I=I+1;
结束时;
结束;
创建过程CopyEntireMessage()开始
设置OutputRoot=InputRoot;
结束;
终端模块;
需要注意的是,首先,重新定义自动生成的过程不是一个好的做法,如果您需要重用设置消息中每个字段的功能,那么最好创建一个新的过程来实现这一点


XMLNS也不推荐使用,因此请改用XMLNSC,它具有更高的性能,并具有与XMLNS相同的所有功能,XMLNS仅用于支持遗留应用程序。

在解决这些类型的问题时,请尝试使用图形调试器,它允许您逐步执行ESQL代码并查看正在构建的树。您很容易就能看到代码没有达到预期效果的地方


尝试了此代码,但随后文件被移动到mqsibackout FOLDERPLUE,您可以执行以下操作:发布“ESQL模块”的完整代码(包含您的过程)并检查您实际使用的解析器(它必须在流的输入节点的设置中)。另外,您可以发布计算节点的“Compute mode”属性的值吗?解析器:XMLNS:对于XML消息(命名空间感知)计算模式:MessageParser和Compute mode看起来正确,那么“ESQL模块”代码呢?您可以发布吗?谢谢Dave。。它的工作正如预期的那样..还感谢您对标准的更正..)但是当我在Main()中使用While循环时。。它不起作用。。你知道吗?或者为什么While不起作用呢?我认为最大的问题是您在基数子句中的选择标准是错误的。假设您没有头OutputRoot.[]我认为将匹配基数为1的单个“Person”元素,因此,您的循环条件永远不会为真,您只是在不进行任何处理的情况下通过while循环。循环的每次迭代都会用输入树覆盖整个输出树,因此即使您确实执行了循环体,并且基数指向正确的路径,您也只会在最后一次看到更改元素。
声明I整数0;声明J整数;SET J=基数(OutputRoot.XMLNSc.person.student[]);而我
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;