You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:34:10