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