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
)
...
但是你已经知道,这种方法充满了问题。
我有一个数据存储在 HTML table 中作为 table 中的 CLOB 类型,我曾尝试参考 以上内容适用于某些值,但它正在中断并给出错误 ORA-06502: PL/SQL: 数字或值错误
ORA-06512:在“SYS.XMLTYPE”,第 272 行 如该参考本身所述 我们可以尝试使用 XML 解析器解析 HTML 文件,但它很可能失败。原因是 HTML 文档可以具有 XML 解析器不理解的以下 HTML 特征。 -- Oracle 中是否有 HTML 解析器而不是 XML 解析器,我曾尝试搜索但没有成功 任何人请帮助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
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
)
...
但是你已经知道,这种方法充满了问题。