Oracle XML处理:删除含unit_qty=0.0000子节点的Receipt节点
问题原因
你的XML根节点定义了默认命名空间xmlns="http //www.w3.org/2000/svg",所有不带前缀的节点都属于该命名空间,你之前的XPath写法没有指定对应命名空间,导致无法匹配到目标节点,自然无法完成删除操作。同时你之前的部分写法定位到了ReceiptDtl或unit_qty子节点,不符合删除整个Receipt父节点的需求。
可行解决方案
方案1:XMLQuery实现(Oracle官方推荐用法)
WITH XML_TABLE AS ( SELECT XMLTYPE(MESSAGE_DATA) AS XML_COLUMN FROM dual ) SELECT XMLQuery( 'declare default element namespace "http //www.w3.org/2000/svg"; copy $NEWXML := $XML modify ( delete nodes $NEWXML/ReceiptDesc/Receipt[ReceiptDtl/unit_qty/text()=$DELETE_VAL] ) return $NEWXML' PASSING XML_COLUMN AS "XML", '0.0000' AS "DELETE_VAL" RETURNING CONTENT ) AS PROCESSED_XML FROM XML_TABLE;
方案2:DELETEXML实现(兼容旧版本Oracle)
SELECT DELETEXML( XMLTYPE(MESSAGE_DATA), '//Receipt[ReceiptDtl/unit_qty/text()="0.0000"]', 'xmlns="http //www.w3.org/2000/svg"' ) AS PROCESSED_XML FROM dual;
核心注意点
- 命名空间声明必须和原始XML的定义完全一致,才能正常匹配节点
- 删除目标定位到
Receipt层级,筛选条件写在节点筛选括号内,即可实现满足子节点条件就删除整个父节点的需求
内容的提问来源于stack exchange,提问作者RC LFA
相关产品推荐
相关产品推荐

