HTML Oracle 中的解析器

HTML Parser in Oracle

我有一个数据存储在 HTML table 中作为 table 中的 CLOB 类型,我曾尝试参考 [ 像下面这样解析它=14=]

with tbl as
(
    SELECT ROW_ID,xmltype(SUBSTR(qe.NOTE, 0, INSTR(qe.NOTE, '<br>')-1)) xml_data
    FROM MY_Table qe
    WHERE EVENT='note' 
)
select
    ROW_ID,rtrim (xmlagg (xmlelement (e, x.data
        || '|')
      ORDER BY x.row_number).extract ('//text()'), '|') AS Data   
from
    tbl
cross join
    xmltable('/table/tr'
        passing tbl.xml_data
        columns
            row_number FOR ORDINALITY,
            data varchar2(2000) path 'td[1]'
            
    ) x
WHERE x.data IS NOT NULL
GROUP BY ROW_ID

以上内容适用于某些值,但它正在中断并给出错误 ORA-06502: PL/SQL: 数字或值错误 ORA-06512:在“SYS.XMLTYPE”,第 272 行 如该参考本身所述 我们可以尝试使用 XML 解析器解析 HTML 文件,但它很可能失败。原因是 HTML 文档可以具有 XML 解析器不理解的以下 HTML 特征。 --

Oracle 中是否有 HTML 解析器而不是 XML 解析器,我曾尝试搜索但没有成功

任何人请帮助

the above is working for some values but it is breaking giving the error ORA-06502: PL/SQL: numeric or value error ORA-06512: at "SYS.XMLTYPE", line 272

如果你有任何 NOTE 没有 <br> 标签,它会得到这个错误,因为这:

SUBSTR(qe.NOTE, 0, INSTR(qe.NOTE, '<br>')-1)

将为空,然后 xmltype() 将抛出该错误。

If - 这是一个很大的 if - 所有注释都以简单的 table 开头,没有嵌入有问题的标签,可能会也可能不会被遵循是一个换行符标签,那么你可以使用一个 case 表达式只在需要的时候做 substr:

with tbl as
(
    SELECT ROW_ID,
      xmltype(
        CASE
          WHEN INSTR(qe.NOTE, '<br>') > 0
          THEN SUBSTR(qe.NOTE, 0, INSTR(qe.NOTE, '<br>')-1)
          ELSE qe.NOTE
        END
      ) xml_data
    FROM MY_Table qe
    WHERE EVENT='note' 
)
...

或者稍微更稳健一点,寻找并提取一个table:

with tbl as
(
    SELECT ROW_ID,
      xmltype(SUBSTR(qe.NOTE, INSTR(qe.NOTE, '<table>'), INSTR(qe.NOTE, '</table>') + 7)) xml_data
    FROM MY_Table qe
    WHERE EVENT='note'
    AND INSTR(qe.NOTE, '<table>') > 0
)
...

db<>fiddle

但是你已经知道,这种方法充满了问题。