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

