TEIID移除JSON响应非法控制字符及XMLTABLE解析报错处理
Teiid JSON响应非法控制字符处理方案
报错根因
0x8 is not allowed in XML content报错来自Teiid底层XML解析器的合规校验:JSONTOXML函数在将JSON结构转换为XML供XMLTABLE解析时,依赖XML 1.0规范的校验规则,该规范明确禁止解析0x00-0x08、0x0B-0x0C、0x0E-0x1F范围的控制字符- 业务示例中的
\b对应ASCII码0x08,属于XML规范禁止的字符序列,会直接中断解析流程 - Teiid 9.1.1版本的
XMLTABLE节点无内置解析异常容错能力,遇到非法字符会直接抛出堆栈中的XOM解析异常,不会自动跳过异常记录
内置能力实现
Teiid提供原生的regexp_replace正则字符串处理函数,可在调用JSONTOXML前对HTTP返回的原始JSON文本做前置清洗,完全不需要自定义函数或外部依赖:
- 匹配规则精准覆盖所有XML解析禁止的控制字符,不会误删业务合法的制表符、换行、回车(0x09、0x0A、0x0D属于XML允许范围,无需过滤)
- 清洗逻辑为将匹配到的非法控制字符直接替换为空字符串,保证传入
JSONTOXML的文本满足XML解析要求
修正后的视图定义
CREATE VIEW Information (firstName string, lastName String) AS SELECT x.firstName, x.lastName FROM ( EXEC model.invokeHttp(action => 'GET', endpoint => url ,stream => 'TRUE') ) AS f, XMLTABLE( '/result/result' PASSING JSONTOXML( 'result', -- 前置清洗原始返回,剔除所有XML禁止的非法控制字符 regexp_replace(f.result, '[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F]', '') ) COLUMNS firstName string PATH 'firstName', lastName string PATH 'lastName' ) x
异常记录跳过相关说明
- Teiid未提供
XMLTABLE/XQuery解析阶段的内置“跳过异常记录”开关,解析过程的异常为硬失败,无法在解析层做容错处理 - 通过前置正则清洗从根源消除非法字符触发的解析异常后,所有返回内容都可正常解析,无需额外跳过逻辑,且不会造成有效业务数据丢失
- 若需对解析完成的字段做规则校验(如空值校验、格式校验),可在查询的WHERE子句中通过过滤条件剔除不符合要求的记录
内容的提问来源于stack exchange,提问作者ASAFDAR
相关产品推荐
相关产品推荐

