PostgreSQL中如何判断字符串是否为有效XML?
解决PostgreSQL中区分有效结构化XML与JSON/纯文本的问题
核心思路:通过捕获XML转换错误实现精确判断
PostgreSQL自带的xml_is_well_formed会将纯文本(包括JSON字符串)判定为有效XML,因为XML允许仅包含文本节点的内容。要实现你需要的精确判断,最可靠的方式是尝试将字符串强制转换为XML类型,捕获转换失败的情况,甚至可以额外检查是否存在结构化的根元素。
方案1:基础版(仅判断是否可转换为XML)
这个函数会返回true给所有能合法转换为XML的内容(包括纯文本),但会排除JSON这类无法转换的字符串:
CREATE OR REPLACE FUNCTION isxml(input_str text) RETURNS boolean AS $$ BEGIN PERFORM input_str::xml; RETURN true; EXCEPTION WHEN OTHERS THEN RETURN false; END; $$ LANGUAGE plpgsql STRICT;
测试示例:
SELECT isxml('{"key":"val"}');→ 返回false(JSON字符串无法转换为XML)SELECT isxml('<key>1</key>');→ 返回true(合法XML结构可转换)
方案2:进阶版(仅判断结构化XML,排除纯文本)
如果需要进一步排除纯文本(仅保留带有根元素的结构化XML),可以在转换后通过xpath检查根元素数量:
CREATE OR REPLACE FUNCTION isxml(input_str text) RETURNS boolean AS $$ DECLARE xml_obj xml; BEGIN xml_obj := input_str::xml; -- 检查是否存在至少一个根元素 RETURN (xpath('count(/*)', xml_obj)) > 0; EXCEPTION WHEN OTHERS THEN RETURN false; END; $$ LANGUAGE plpgsql STRICT;
测试示例:
SELECT isxml('hello world');→ 返回false(纯文本无结构化根元素)SELECT isxml('<key>1</key>');→ 返回true(有合法根元素)SELECT isxml('{"key":"val"}');→ 返回false(无法转换为XML)
为什么自带函数不适用?
xml_is_well_formed的设计目标是检查字符串是否符合XML的语法规范,而XML允许仅包含文本节点的内容(比如纯字符串"hello"本身就是合法的XML片段)。但你的需求是筛选结构化的XML文档,因此需要通过转换+额外检查来实现精确匹配。
内容的提问来源于stack exchange,提问作者neveratdennys
相关产品推荐
相关产品推荐

