Oracle中从CLOB列XML第二行提取.xsd结尾URL的方法
在Oracle中从CLOB列的XML第二行提取.xsd结尾的URL
方法一:用正则表达式直接处理CLOB
如果确定目标URL一定在XML的第二行,可以先提取第二行内容,再从中匹配.xsd结尾的URL:
SELECT REGEXP_SUBSTR( -- 截取XML的第二行内容 DBMS_LOB.SUBSTR( xml_clob, INSTR(xml_clob, CHR(10), 1, 2) - INSTR(xml_clob, CHR(10), 1, 1) - 1, INSTR(xml_clob, CHR(10), 1, 1) + 1 ), -- 匹配http/https开头、以.xsd结尾的URL(适配引号包裹的场景) 'https?://[^"]+\.xsd' ) AS xsd_url FROM test_table;
说明
CHR(10)代表换行符,通过INSTR定位前两个换行符的位置,截取中间的第二行内容。- 正则表达式
https?://[^"]+\.xsd会精准匹配到被引号包裹的、以.xsd结尾的URL,适配你给出的两种示例场景。
方法二:用XML解析(更稳定可靠)
正则处理XML容易因为格式变动(比如换行、空格调整)出错,用Oracle的XML原生函数更稳妥,不用依赖行号:
SELECT CASE -- 先判断是否存在schemaLocation属性 WHEN EXISTSNODE(XMLTYPE(xml_clob), '//*[@xsi:schemaLocation]', 'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"') THEN -- 提取schemaLocation中以.xsd结尾的URL REGEXP_SUBSTR( EXTRACTVALUE(XMLTYPE(xml_clob), '//*/@xsi:schemaLocation', 'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"'), '[^ ]+\.xsd' ) ELSE -- 提取xmlns属性里的.xsd URL REGEXP_SUBSTR( EXTRACTVALUE(XMLTYPE(xml_clob), '//*/@xmlns'), 'https?://[^"]+\.xsd' ) END AS xsd_url FROM test_table;
说明
XMLTYPE(xml_clob)把CLOB类型的XML转为可解析的XML对象。EXISTSNODE用来判断XML是否包含schemaLocation属性,分别处理两种示例的情况。EXTRACTVALUE提取对应属性的值,再用正则筛选出目标URL。
注意
- 如果XML有其他命名空间,需要在XPath中补充对应的命名空间声明。
- 若CLOB内容过大,可调整
DBMS_LOB.SUBSTR的参数确保能完整截取目标内容。
内容的提问来源于stack exchange,提问作者user313150
相关产品推荐
相关产品推荐

