在 PL/SQL 中删除 xml 节点

Posted

技术标签:

【中文标题】在 PL/SQL 中删除 xml 节点【英文标题】:Deleting xml node in PL/SQL 【发布时间】:2013-04-11 14:12:57 【问题描述】:

如何使用 PL/SQL 从 xmltype 中删除节点?示例:

<people>
   <person>
      <personNO>1</personNO>
   </person>
   <person>
      <personNO>2</personNO>
   </person>
</people>

如果 /people/person/personNO 为 1,我会尝试删除整个节点 person。我的 xml 文档位于 l_xml xmltype 变量中。到目前为止,我得到了:

SELECT deletexml(l_xml, '/people/person[personNO="1"]')
INTO l_xml
FROM dual;

它似乎根本不起作用。您能提出任何解决方案吗?

【问题讨论】:

【参考方案1】:

定义“根本不起作用”,因为它会正常工作:

(在 10.2.0.4 + 11.2.0.3 上测试)

SQL> declare
  2    l_xml xmltype;
  3  begin
  4
  5    l_xml := xmltype.createXML('<people>
  6     <person>
  7        <personNO>1</personNO>
  8     </person>
  9     <person>
 10        <personNO>2</personNO>
 11     </person>
 12  </people>');
 13
 14    select deletexml(l_xml, '/people/person[personNO="1"]')
 15      into l_xml
 16      from dual;
 17
 18    dbms_output.put_line(l_xml.getstringval());
 19  end;
 20  /
<people><person><personNO>2</personNO></person></people>

PL/SQL procedure successfully completed.

因此删除了 person no = 1 的整个 person 节点。如果您打算清除每个节点(如果 personNO 1 存在于其中任何一个节点中),那么您希望将 xpath 设置为 /people/person[../person/personNO="1"]

【讨论】:

这很奇怪,因为“根本不起作用”我的意思是“完全什么都不做”。对我来说,那段代码没有给出想要的输出。 @Jandrejc - 没有提供所需的输出,或者没有提供任何输出?您是否打开了服务器输出以便看到dbms_output? (set serveroutput on 在 SQL*Plus 中) 不提供所需的输出。它给了我原始的 xml,带有应该被删除的节点。 @Jandrejc 建议您需要 Oracle 支持来查看一个错误。你在哪个oracle版本上?我假设您的真实 XML 不使用命名空间,因为如果使用,您需要声明它们以使 xpath 正确匹配节点。

以上是关于在 PL/SQL 中删除 xml 节点的主要内容,如果未能解决你的问题,请参考以下文章

oracle的PL/SQL中如何根据节点名称直接获取xml某个节点的值

pl/sql:将 xmltype 转换为节点

将同一层次结构级别的两个节点与 PL/SQL 关联

如何在 PL/SQL 中解析 XML

将 XML 数据存储在表中的 PL/SQL 过程抛出错误(23,102):PL/SQL:ORA-00907:缺少右括号

使用 PL/SQL 解析 XML 输出 html 中特定标签的内容