Oracle PL/SQL中XQuery添加命名空间引用及XML节点问题求助
解决方案
你的问题核心是原XML的envelope节点属于默认命名空间hal:icl:01,但XQuery中未声明该命名空间,导致无法定位目标节点,插入操作失效。以下是修复后的代码和关键说明:
修复后的代码
DECLARE xmldoc XMLTYPE; vQuery CLOB; BEGIN SELECT xmltype ('<envelope xmlns="hal:icl:01"> <sender> <name>name</name> <country>CT</country> <address>first part</address> <address>second part</address> <sender_identifier>abc1</sender_identifier> <sender_eddress> <sender_agent>y1</sender_agent> <sender_mailbox>code</sender_mailbox> </sender_eddress> </sender> </envelope>') INTO xmldoc FROM DUAL; -- 在XQuery开头声明命名空间,绑定前缀ns到目标命名空间 vQuery := 'declare namespace ns = "hal:icl:01"; copy $tmp := $src modify (insert node $Additional as last into $tmp/ns:envelope) return $tmp'; SELECT XMLQUERY (vQuery PASSING xmldoc AS "src", XMLTYPE ('<cbs_extra><emailId></emailId><organizationUnit></organizationUnit></cbs_extra>') AS "Additional" RETURNING CONTENT) INTO xmldoc FROM DUAL; DBMS_OUTPUT.put_line (XMLDOC.getclobval ()); END; /
关键说明
- 命名空间声明:在XQuery开头添加
declare namespace ns = "hal:icl:01";,将前缀ns绑定到原XML的默认命名空间。之后必须用ns:envelope访问目标节点,否则XQuery会认为你要找无命名空间的envelope,而原节点属于指定命名空间,无法匹配。 - 新增节点的命名空间控制:
- 如果希望
cbs_extra加入同一个命名空间,需要给它添加xmlns="hal:icl:01"属性,修改后的节点字符串为:<cbs_extra xmlns="hal:icl:01"><emailId></emailId><organizationUnit></organizationUnit></cbs_extra> - 如果不需要让新增节点属于该命名空间,保持原代码即可,插入后
cbs_extra会处于无命名空间状态。
- 如果希望
内容的提问来源于stack exchange,提问作者user2774394
相关产品推荐
相关产品推荐

