如何检查存储在 Oracle SQL 中的列值中的未关闭标记

How to check unclosed tags stored in column values in oracle sql

提问人:Arun 提问时间:10/17/2023 最后编辑:MT0Arun 更新时间:10/17/2023 访问量:36

问:

我有一个表,其中一行的列值如下

“SERIS正在开发一种高质量的天空成像系统,用于太阳能资源评估和预测。其中一个关键特征涉及辐照度测量。第一次测试很有希望,平均绝对误差接近 50 W/m<sup>2</sup>。

在这里你可以标记 /sup> 是不完整的,因为它没有起始标记

我想通过sql查询在我的表中找到有多少列具有未关闭的标签

任何解决方案

SQL XML 预言机

评论


答:

1赞 MT0 10/17/2023 #1

如果您想确定 XML 是否有效,请使用 XML 解析器。

您可以使用函数来测试对 XML 的解析并捕获任何异常,然后对无效行进行计数:

WITH FUNCTION is_valid_xml(data CLOB) RETURN NUMBER
     IS
       v_xml XMLTYPE;
     BEGIN
       v_xml := XMLTYPE('<root>' || data || '</root>');
       RETURN 1;
     EXCEPTION
       WHEN OTHERS THEN
         RETURN 0;
     END;
SELECT COUNT(*)
FROM   table_name
WHERE  is_valid_xml(column_name) = 0;

其中,对于示例数据:

CREATE TABLE table_name (column_name) AS
SELECT EMPTY_CLOB() || '<sup>2</sup>' FROM DUAL UNION ALL
SELECT EMPTY_CLOB() || '<sup>2/sup>' FROM DUAL;

输出:

计数(*)
1

您还可以使用以下命令创建存储函数(而不是将其内联声明到查询中):

CREATE FUNCTION is_valid_xml(data CLOB) RETURN NUMBER
IS
  v_xml XMLTYPE;
BEGIN
  v_xml := XMLTYPE('<root>' || data || '</root>');
  RETURN 1;
EXCEPTION
  WHEN OTHERS THEN
    RETURN 0;
END;
/

小提琴

评论

0赞 Arun 10/18/2023
嗨,感谢您的回答,但我的要求不是检查 xml 是否有效,事情是按照示例,我想找到具有未关闭标签的标签的列值
0赞 MT0 10/18/2023
@Arun 实际上,它是一样的。想象一下,你有 XML,你可以问是否和有匹配的结束标记(你可能会得到错误的答案,是的,每个都有一个结束标记),或者你可以问它是否是有效的 XML,答案是,不,它不是,因为和结束标签的顺序错误,所以被关闭但没有,然后有一个虚假的结束标签。如果你想正确地解析XML,那么你需要使用XML解析器(不要尝试使用正则表达式)。<A><B></A></B>ABABABABB