Websphere Message Broker: доступ к элементам XML в ESQL

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>

Кто-нибудь может мне помочь в этом?

3 ответа

Решение

Этот вычислительный модуль должен делать то, что вам нужно, протестировано на 9001 на Linux:

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, который сохраняется только для поддержки устаревших приложений.

Я думаю, что ваш код должен быть таким:

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" несколько раз, нужно только один раз.

Попробуйте использовать графический отладчик при решении этих типов проблем, он позволяет вам шагать по коду ESQL и наблюдать за построением дерева. Вы легко сможете увидеть, где код не выполняет то, что ожидал.

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

Другие вопросы по тегам