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
相关产品推荐
相关产品推荐

