如何在IBM Integration Bus中通过XMLNS生成重复XML元素节点?
在IBM Integration Bus中用ESQL生成多个重复的Employee节点
你遇到的问题很典型——直接重复赋值tnsp:Employee的子节点时,ESQL默认会定位到已存在的第一个Employee元素并修改它,而不是创建新的节点。要生成多个重复的元素,你需要显式创建新的节点实例,下面是几种可行的解决方案:
方法1:手动创建多个Employee节点
通过CREATE LASTCHILD语句在Response节点下逐个添加新的Employee元素,并用[LAST]索引指定操作刚创建的节点:
DECLARE tnsp NAMESPACE '...'; SET OutputRoot.XMLNS.Response.(XML.NamespaceDecl)xmlns:acc = tnsp; SET OutputRoot.XMLNS.Response.tnsp:ReqID = 'ID102'; SET OutputRoot.XMLNS.Response.tnsp:CompanyName = 'Example'; -- 创建第一个Employee节点 CREATE LASTCHILD OF OutputRoot.XMLNS.Response NAME tnsp:Employee; SET OutputRoot.XMLNS.Response.tnsp:Employee[LAST].tnsp:id = 'E100'; SET OutputRoot.XMLNS.Response.tnsp:Employee[LAST].tnsp:name = 'John'; -- 创建第二个Employee节点 CREATE LASTCHILD OF OutputRoot.XMLNS.Response NAME tnsp:Employee; SET OutputRoot.XMLNS.Response.tnsp:Employee[LAST].tnsp:id = 'E101'; SET OutputRoot.XMLNS.Response.tnsp:Employee[LAST].tnsp:name = 'Alex';
方法2:使用引用简化代码
如果觉得重复写完整路径麻烦,可以用REFERENCE变量指向Response节点,再创建子元素:
DECLARE tnsp NAMESPACE '...'; SET OutputRoot.XMLNS.Response.(XML.NamespaceDecl)xmlns:acc = tnsp; SET OutputRoot.XMLNS.Response.tnsp:ReqID = 'ID102'; SET OutputRoot.XMLNS.Response.tnsp:CompanyName = 'Example'; -- 指向Response节点的引用 DECLARE responseRef REFERENCE TO OutputRoot.XMLNS.Response; -- 第一个Employee CREATE LASTCHILD OF responseRef NAME tnsp:Employee; SET responseRef.tnsp:Employee[LAST].tnsp:id = 'E100'; SET responseRef.tnsp:Employee[LAST].tnsp:name = 'John'; -- 第二个Employee CREATE LASTCHILD OF responseRef NAME tnsp:Employee; SET responseRef.tnsp:Employee[LAST].tnsp:id = 'E101'; SET responseRef.tnsp:Employee[LAST].tnsp:name = 'Alex';
方法3:从数据源循环生成(推荐用于批量场景)
如果你的员工数据来自数据库查询或其他批量数据源,可以用游标循环创建节点:
DECLARE tnsp NAMESPACE '...'; SET OutputRoot.XMLNS.Response.(XML.NamespaceDecl)xmlns:acc = tnsp; SET OutputRoot.XMLNS.Response.tnsp:ReqID = 'ID102'; SET OutputRoot.XMLNS.Response.tnsp:CompanyName = 'Example'; -- 假设从数据库查询员工数据,这里用游标遍历结果 DECLARE empCursor CURSOR FOR SELECT id, name FROM Database.EmployeeTable; DECLARE empRow ROW; OPEN empCursor; FETCH empCursor INTO empRow; WHILE (SQLCODE = 0) DO -- 每次循环创建一个新的Employee节点 CREATE LASTCHILD OF OutputRoot.XMLNS.Response NAME tnsp:Employee; SET OutputRoot.XMLNS.Response.tnsp:Employee[LAST].tnsp:id = empRow.id; SET OutputRoot.XMLNS.Response.tnsp:Employee[LAST].tnsp:name = empRow.name; FETCH empCursor INTO empRow; END WHILE; CLOSE empCursor;
关键原理说明
CREATE LASTCHILD OF ... NAME tnsp:Employee:强制在父节点下创建一个全新的Employee元素,避免覆盖已有节点。[LAST]索引:ESQL中如果有多个同名元素,[LAST]会定位到最后一个(也就是刚创建的)元素,确保赋值操作不会影响之前的节点。
用以上方法生成的XML会符合你的需求,包含多个独立的acc:Employee节点。
内容的提问来源于stack exchange,提问作者Sivaprasad
相关产品推荐
相关产品推荐

