Oracle XMLTABLE - 如何从 XMLType 中删除节点?

Posted

技术标签:

【中文标题】Oracle XMLTABLE - 如何从 XMLType 中删除节点?【英文标题】:Oracle XMLTABLE - how to remove a node from XMLType? 【发布时间】:2022-01-14 16:11:15 【问题描述】:

假设我们有以下 XML:

<root>
  <item>
    <a>a1</a>
    <b>b1</b>
    <c>c1</c>
    <d>d1</d>
    <e>e1</e>
  </item>
  <item>
    <a>a2</a>
    <b>b2</b>
    <c>c2</c>
    <d>d2</d>
    <e>e2</e>
  </item>
  ...
</root>

如何使用 XMLTABLE 和 PATH 获得以下结果?

A   B   ITEM_XML (excluding <d>)
a1  b1  <item><a>a1</a><b>b1</b><c>c1</c><e>e1</e></item>
a2  b2  <item><a>a2</a><b>b2</b><c>c2</c><e>e2</e></item>

请不要 DELETEXML,因为它已被弃用。我对如何从 XMLType 中删除/排除某些节点特别感兴趣。请注意,ITEM_XML 应该像原始的一样打印出来,这样放在表格中更方便。

【问题讨论】:

您的 Oracle 版本是多少? 【参考方案1】:

从 Oracle Database 12c 第 1 版 (12.1.0.1) 开始,使用 XQuery Update 更新 XML 数据。 (https://docs.oracle.com/en/database/oracle/oracle-database/12.2/adxdb/deprecated-functions-for-updating-XML-data.html)。删除节点示例:

UPDATE warehouses SET warehouse_spec =
  XMLQuery('copy $tmp := . modify delete node
        $tmp/Warehouse/VClearance return $tmp'
       PASSING warehouse_spec RETURNING CONTENT)
  WHERE warehouse_spec IS NOT NULL;

【讨论】:

完美运行 :) 一直在玩这个,但没有运气。你的例子确实有效。谢谢!

以上是关于Oracle XMLTABLE - 如何从 XMLType 中删除节点?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Oracle 11g 的 XMLtable

Oracle XMLTable / XMLTYPE(不知道)

XMLTable 不会从 XML 中的子项获取数据

使用 XMLTable 函数从 XML 中提取数据

如何在 oracle XMLTYPE XMLTABLE 中支持 1 级路径目录

Oracle XMLtable 提供交叉连接的数据