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>
有人可以帮我吗?
答案 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