XMLTABLE与extractvalue解析XML提取属性时均返回NULL求助
解决XML解析多个同名属性标签返回Null的问题
问题出在哪
你的查询返回Null主要是这几个问题:
extractvalue里用了@value[0]——XPath的索引是从1开始的,不是0;而且这个方法Oracle已经不推荐使用,建议换用XMLTABLE。- XMLTABLE里
test1的路径写的是Entity[@name="companycode"]/text(),但你的<Entity>标签里没有文本内容,value是它的属性,得用@value才能拿到对应值。 test2的Entity[1]返回的是整个节点的XML代码,不是你要的属性值,完全不符合需求。
正确的两种解析方法
1. 把每个符合条件的value单独拆成一行
适合需要逐个处理每个companycode的场景:
SELECT x.company_code, b.XMLPref FROM test.XMLTABLE b CROSS JOIN XMLTABLE( '/ParentProfiler/SettingExp/Entity[@name="companycode"]' PASSING XMLTYPE(b.XMLPref) COLUMNS company_code VARCHAR2(100) PATH '@value' ) x;
执行后会得到两行结果:
| COMPANY_CODE | XMLPREF |
|---|---|
| fn8ks92in | [你的XML内容] |
| 0xm9n4mdk | [你的XML内容] |
2. 把多个value合并成一行(逗号分隔)
如果需要把所有companycode合并到同一行,可使用Oracle 12c及以上支持的string-join函数:
SELECT x.combined_codes, b.XMLPref FROM test.XMLTABLE b CROSS JOIN XMLTABLE( '/ParentProfiler/SettingExp' PASSING XMLTYPE(b.XMLPref) COLUMNS combined_codes VARCHAR2(200) PATH 'string-join(Entity[@name="companycode"]/@value, ",")' ) x;
执行后会得到一行结果:
| COMBINED_CODES | XMLPREF |
|---|---|
| fn8ks92in,0xm9n4mdk | [你的XML内容] |
关键注意点
- 取XML属性用
@属性名,取标签内的文本内容才用text(),不要混淆。 - 避免使用
extractvalue,Oracle官方推荐使用XMLTABLE进行XML解析,功能更强大且符合现代标准。 - 确保XML格式合法无语法错误,否则XMLTYPE转换会失败,也会导致返回Null。
内容的提问来源于stack exchange,提问作者theflarenet
相关产品推荐
相关产品推荐

