Парсер HTML в Oracle

У меня есть данные, хранящиеся в виде таблицы HTML в виде типа CLOB в таблице, я пытался проанализировать их, как показано ниже, со ссылкой из Разбор таблицы HTML с помощью Oracle

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, как указано в самой ссылке Мы можем попробовать разобрать файл HTML с помощью синтаксического анализатора XML, но, скорее всего, это не удастся. Причина в том, что HTML-документы могут иметь следующие особенности HTML, которые парсеры XML не понимают. -- https://stackoverflow.com/a/32573619/266304

Есть ли в Oracle синтаксический анализатор HTML вместо синтаксического анализатора XML, я пытался искать, но ничего не вышло

Кто-нибудь, пожалуйста, помогите


person Rajesh    schedule 16.06.2021    source источник
comment
Вы можете использовать парсер Java HTML и встраивать классы в базу данных с помощью команд CREATE JAVA или утилиты loadjava.   -  person MT0    schedule 16.06.2021
comment
У меня есть только права чтения в базе данных, возможно ли это?   -  person Rajesh    schedule 16.06.2021
comment
Нет, вам нужно будет заставить администратора баз данных импортировать классы Java после их создания, если вы используете решение Java.   -  person MT0    schedule 16.06.2021


Ответы (1)


вышеприведенное работает для некоторых значений, но не работает, выдавая ошибку ORA-06502: PL/SQL: ошибка числового значения или значения ORA-06512: at SYS.XMLTYPE, строка 272

Он получит эту ошибку, если у вас есть какие-либо значения NOTE, которые не имеют тег <br>, потому что это:

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

тогда будет нуль, и xmltype() выдаст эту ошибку.

Если — и это большое если — все заметки начинаются с простой таблицы без встроенных проблемных тегов, за которой может следовать или не следовать тег разрыва строки, тогда вы можете использовать регистр выражение для выполнения 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' 
)
...

Или, возможно, немного более надежно, найдите и извлеките таблицу:

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

Но, как вы уже знаете, такой подход чреват проблемами.

person Alex Poole    schedule 16.06.2021
comment
Спасибо, Алекс, это сработало, но с ошибками из-за специальных символов. Я заменил специальные символы. - person Rajesh; 16.06.2021