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

Oracle 12c中使用XQuery合并匹配节点的XML文档

Oracle 12c 基于XQuery合并XML文档

需求

  • 第二个XML中的新节点需添加到结果中
  • 匹配节点更新对应值
  • 可限定仅对比顶层节点(若无法处理任意结构XML)

示例数据与实现代码

with t as (select
XMLType(
'<root>
  <node1>
   <data1>1</data1>
  </node1>
  <node2>
   <data2>2</data2>
  </node2>
  <node3>
   <data3>3</data3>
  </node3>
 </root>') oldx,
XMLType(
'<root>
  <node1>
   <data1>11</data1>
   <data12>12</data12>
  </node1>
  <node3>
   <data33>33</data33>
   <data34>34</data34>
  </node3>
 </root>') newx from dual)
select oldx, newx,
xmlquery(
'copy $result := $old/root
modify (
  for $new_node in $new/root/*
  let $match := $result/*[name() = name($new_node)]
  return (
    if ($match) then (
      -- 更新匹配的子节点值
      for $child in $match/*
      let $new_child := $new_node/*[name() = name($child)]
      where $new_child
      return replace value of node $child with $new_child/text(),
      -- 插入原节点没有的新子节点
      for $new_child in $new_node/*
      where not($match/*[name() = name($new_child)])
      return insert node $new_child into $match
    ) else (
      -- 插入全新的顶层节点
      insert node $new_node into $result
    )
  )
) return $result'
passing oldx as "old", newx as "new" returning content) merged_xml
from t;

预期合并结果

<root>
  <node1>
   <data1>11</data1>
   <data12>12</data12>
  </node1>
  <node2>
   <data2>2</data2>
  </node2>
  <node3>
   <data3>3</data3>
   <data33>33</data33>
   <data34>34</data34>
  </node3>
 </root>

说明

  • 代码通过XQuery的copy创建原XML副本,遍历新XML的顶层子节点进行处理
  • 匹配顶层节点时:先更新同名子节点的值,再插入原节点不存在的新子节点
  • 未匹配的顶层节点直接插入结果XML
  • 修正了原示例中新XML的标签错误(原</data2>应为</data12>),保证XML结构合法

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 10:01:25