在处理 XML 时,如何在特定节点之后插入一个节点?

Posted

技术标签:

【中文标题】在处理 XML 时,如何在特定节点之后插入一个节点?【英文标题】:While processing XML, how to insert a node after a specific node? 【发布时间】:2021-12-02 10:19:09 【问题描述】:

考虑以下我收到并解析的 XML 文档:

<Courses>
  <Course>
    <Name>Intro to DB</Name>
    <Credits>3.0</Credits>
  </Course>
  <Course>
    <Name>Intro to Programming</Name>
    <Credits>3.0</Credits>
  </Course>
</Courses>

如果我想在两门课程之间添加一门新课程或在每门课程中添加一个新元素(例如 courseId)。我怎样才能在进行中实现这一目标?我已经阅读了 Progress 的 XML 文档(针对 DOM 和 SAX)并找到了 INSERT-BEFORE(),不确定是否可以使用它来实现这一点。

我必须使用 temp-table/ProDataSets 来实现这一点吗?

【问题讨论】:

临时表或数据集的使用取决于你想做什么。这是您自己创建的 xml,还是以其他方式获得的?您可以使用 DOM 或数据集来完成。 SAX 只会让您解析 xml,而不是创建它。你也可以用文本文件输出来做到这一点,但这可能是一种奇怪的方法(但很简单)。 @Jensd 所以 SAX-WRITER 不是真的在写作?!? ;-) @StefanDrissen 当然你是对的,我只是短暂地使用过 SAX-READER。我以为它只是 Windows ......所以我真的从来没有打扰过。 【参考方案1】:

带有临时表和数据集的示例

此处的数据集仅用于格式化 xml 输出

DEFINE TEMP-TABLE ttCourse NO-UNDO XML-NODE-NAME "Course"
   FIELD dSORT AS DECIMAL SERIALIZE-HIDDEN // hidden in xml output
   FIELD Name AS CHARACTER
   FIELD Credits AS DECIMAL
   FIELD NEWFIELD AS CHARACTER
                               
   INDEX SORT dSORT ASCENDING. // this index for sorting the xml output Course
                                 

DEFINE VARIABLE cxml AS LONGCHAR  NO-UNDO.
DEFINE VARIABLE iCnt AS INTEGER    NO-UNDO.

// DEFINE DATASET only for xml-node-name
DEFINE DATASET ds 
   XML-NODE-NAME "Courses"  FOR ttCourse.

cxml = "<Courses>
  <Course>
    <Name>Intro to DB</Name>
    <Credits>3.0</Credits>
  </Course>
  <Course>
    <Name>Intro to Programming</Name>
    <Credits>3.0</Credits>
  </Course>
</Courses>".

TEMP-TABLE ttCourse:READ-XML ("LONGCHAR", cxml, "MERGE",  "", FALSE, ?, ?). 

// for sorting output use field dsort
FOR EACH ttCourse WHERE ttCourse.DSORT = 0:
    iCnt = iCnt + 1.
    ttCourse.DSORT = iCnt.
END.

// insert a record in the middle
CREATE ttCourse.
ASSIGN
   ttCourse.DSORT = 1.5
   ttCourse.name = "test"
   ttCourse.credits = 5.5
   ttCourse.NEWFIELD = "NEWFIELD"
   .
  
DATASET ds:WRITE-XML ("file", "C:/temp/baz/courses.xml", TRUE,?,?,FALSE,FALSE).

【讨论】:

以上是关于在处理 XML 时,如何在特定节点之后插入一个节点?的主要内容,如果未能解决你的问题,请参考以下文章

在特定位置插入 XML 节点

SQL:使用 modify 函数迭代 xml 节点或如何递归地插入或修改节点

使用 Jackson 解析 XML 时如何忽略特定节点

如何在文本中添加/插入 xml 节点

R:将节点插入到特定位置的xml树中

如何修复关闭后插入的 XML 节点