Oracle 11g中PLSQL验证CLOB存储的XML良构性报错如何解决
问题根因
- XML中使用了
xsi:nil属性,但根节点未声明xsi对应的命名空间,XML解析器无法识别xsi前缀,直接触发良构性校验失败,这是最核心的报错原因。 - 存量CLOB数据可能存在开头BOM字符、XML非法控制字符的情况,也会导致解析报错。
解决方法
修改PL/SQL代码,补全xsi命名空间声明,同时过滤非法字符即可,修改后代码如下:
DECLARE clob_rec CLOB; xml_header VARCHAR2(100); x xmltype; processed_clob CLOB; CURSOR get_xml_clob_ IS SELECT data FROM xml_report_data_tab WHERE report_id = 'DET_REP' AND result_key = '15332672'; BEGIN OPEN get_xml_clob_; FETCH get_xml_clob_ INTO clob_rec; CLOSE get_xml_clob_; -- 步骤1:过滤CLOB中的非法控制字符、开头不可见BOM字符 clob_rec := TRIM(BOTH CHR(0) FROM TRIM(clob_rec)); clob_rec := REGEXP_REPLACE(clob_rec, '[^[:print:][:space:]]', ''); -- 步骤2:拼接XML声明,同时给根节点补全xsi标准命名空间声明 xml_header := '<?xml version="1.0" encoding="UTF-8" ?>'; processed_clob := TO_CLOB(xml_header) || REPLACE(clob_rec, '<JOURNAL_DET_NS_REP>', '<JOURNAL_DET_NS_REP xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">'); -- 步骤3:构造XMLType,加WELLFORMED参数跳过非核心校验,提升兼容性 x := XMLPARSE(DOCUMENT processed_clob WELLFORMED); --后续将使用x进行其他操作 END;
补充说明
- 如果根节点本身存在其他属性,可将根节点替换逻辑改为正则匹配,避免替换失败:
processed_clob := TO_CLOB(xml_header) || REGEXP_REPLACE(clob_rec, '<JOURNAL_DET_NS_REP(\s|>)', '<JOURNAL_DET_NS_REP xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\1', 1, 1);
- 如果执行后仍报错,可通过
DBMS_LOB.SUBSTR(processed_clob, 4000, 1)打印前4000字符检查是否存在标签未闭合、特殊字符等其他良构性问题。
内容的提问来源于stack exchange,提问作者Uthpala Dl
相关产品推荐
相关产品推荐

