如何在Oracle SQL中从带命名空间的XML提取op与id值?
解决Oracle SQL提取不同命名空间XML中op和id值的问题
没问题,针对你这种带不同命名空间、不同根节点的XML提取需求,完全可以用Oracle官方推荐的XMLTABLE函数来替代已废弃的EXTRACTVALUE,而且能实现你想要的类似/*/header/op的简洁写法。
通用通配符写法(适配任意命名空间)
这种写法不需要提前知道所有命名空间,用通配符匹配任意元素,非常灵活:
SELECT x.op, x.id FROM items, XMLTABLE( '/*' -- 匹配任意根元素(不管是<change>还是<deactivate>) PASSING XMLTYPE(intreevalue) COLUMNS op VARCHAR2(10) PATH '*/header/op', -- 匹配任意命名空间下的header/op id VARCHAR2(20) PATH '*/id' -- 匹配任意根节点下的id ) x;
代码解释:
XMLTABLE是Oracle从11g开始主推的XML数据处理函数,功能比EXTRACTVALUE更强大,也更符合SQL/XML标准。- 路径中的
*作为通配符,可以匹配任意命名空间下的任意元素,完美解决你不同XML节点带不同命名空间的问题。 PASSING XMLTYPE(intreevalue)用来把表中的字符串类型列转换为XML类型,方便后续解析。
精准命名空间写法(适用于已知所有命名空间的场景)
如果你的XML命名空间是固定的,也可以明确指定命名空间,让查询更精准:
SELECT x.op, x.id FROM items, XMLTABLE( XMLNAMESPACES( 'http://do.it.com/ch/PLP' AS "ns1", 'http://mrlo.com/nnu/XCBouIK' AS "ns2" ), '(/ns1:change | /ns2:deactivate)' -- 匹配两种命名空间下的根节点 PASSING XMLTYPE(intreevalue) COLUMNS op VARCHAR2(10) PATH './header/op', id VARCHAR2(20) PATH './id' ) x;
注意事项:
你提供的第二条XML里有个小语法错误:<op>XDG</id>应该是</op>,这种标签不闭合的情况会导致XML解析失败,实际业务中要确保XML格式是合法的。
内容的提问来源于stack exchange,提问作者kubrdom
相关产品推荐
相关产品推荐

