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

Progress环境下处理XML时如何在特定节点后插入新节点

Progress ABL XML节点插入操作指南

核心疑问解答

  • 你找到的INSERT-BEFORE()方法完全可以实现指定位置插入节点的需求
  • 不需要必须使用temp-table或ProDataSets:这两类组件适合XML结构与业务数据结构高度匹配、需要批量读写XML的场景,仅做简单节点插入直接使用DOM操作即可,灵活度更高。

具体场景实现

场景1:在两个Course节点之间插入新的Course节点

实现逻辑:如果要在A节点之后插入新节点,只需找到A节点的下一个兄弟节点B,调用INSERT-BEFORE()把新节点插入到B之前即可,效果等价于插入到A之后。
示例代码:

DEFINE VARIABLE hDoc         AS HANDLE  NO-UNDO.
DEFINE VARIABLE hRoot      AS HANDLE  NO-UNDO.
DEFINE VARIABLE hFirstCourse AS HANDLE NO-UNDO.
DEFINE VARIABLE hNextSib   AS HANDLE  NO-UNDO.
DEFINE VARIABLE hNewCourse AS HANDLE  NO-UNDO.
DEFINE VARIABLE hNewNode  AS HANDLE  NO-UNDO.

/* 创建DOM文档对象并加载XML,也可以直接加载你接收到的XML字符串,把LOAD第一个参数改为"STRING"即可 */
CREATE X-DOCUMENT hDoc.
hDoc:LOAD("FILE", "你的XML文件路径.xml", FALSE).
hRoot = hDoc:DOCUMENT-ELEMENT.

/* 找到第一个Course节点 */
hFirstCourse = hRoot:GET-CHILD("Course", 1).
/* 获取第一个Course的下一个兄弟节点,也就是第二个Course */
hNextSib = hFirstCourse:NEXT-SIBLING.

/* 创建新的Course节点及内部元素 */
CREATE X-NODEREF hNewCourse.
hRoot:CREATE-ELEMENT("Course", hNewCourse).
/* 新增Name子节点 */
hRoot:CREATE-ELEMENT("Name", hNewNode).
hNewNode:NODE-VALUE = "Data Structure".
hNewCourse:APPEND-CHILD(hNewNode).
/* 新增Credits子节点 */
hRoot:CREATE-ELEMENT("Credits", hNewNode).
hNewNode:NODE-VALUE = "4.0".
hNewCourse:APPEND-CHILD(hNewNode).

/* 插入到两个Course节点之间 */
IF VALID-HANDLE(hNextSib) THEN
  hRoot:INSERT-BEFORE(hNewCourse, hNextSib).
ELSE
  /* 如果目标是最后一个节点之后,直接追加即可 */
  hRoot:APPEND-CHILD(hNewCourse).

/* 保存修改后的XML,也可以直接获取字符串内容 */
hDoc:SAVE("FILE", "修改后的文件路径.xml").
/* 释放资源 */
DELETE OBJECT hDoc.

场景2:为每个Course节点内部添加courseId元素

示例代码:

DEFINE VARIABLE hDoc         AS HANDLE  NO-UNDO.
DEFINE VARIABLE hRoot      AS HANDLE  NO-UNDO.
DEFINE VARIABLE hCourse    AS HANDLE  NO-UNDO.
DEFINE VARIABLE hCourseId  AS HANDLE  NO-UNDO.
DEFINE VARIABLE i          AS INTEGER NO-UNDO.

CREATE X-DOCUMENT hDoc.
hDoc:LOAD("FILE", "你的XML文件路径.xml", FALSE).
hRoot = hDoc:DOCUMENT-ELEMENT.

/* 遍历所有Course节点 */
DO i = 1 TO hRoot:NUM-CHILDREN("Course"):
  hCourse = hRoot:GET-CHILD("Course", i).
  /* 创建courseId节点 */
  hRoot:CREATE-ELEMENT("courseId", hCourseId).
  hCourseId:NODE-VALUE = STRING(i).
  /* 插入到Course内部的最前面,也可以根据需求调整插入到指定位置 */
  hCourse:INSERT-BEFORE(hCourseId, hCourse:FIRST-CHILD).
END.

hDoc:SAVE("FILE", "修改后的文件路径.xml").
DELETE OBJECT hDoc.

内容的提问来源于stack exchange,提问作者SJaka

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 07:36:02