Разбор HTML таблицы в Oracle не работает - PullRequest
1 голос
/ 14 марта 2020

Я пытался проанализировать таблицу HTML в oracle и попытаться извлечь данные внутри нее, используя запрос

with tbl as
(
    select xmltype('<table class="table table-striped " border=''1''>
 <caption>ACO Details</caption>
 <tr><th><b>Record</b></th><th><b>Changed ACO(s)</b></th></tr>
 <tr><td> Added   ACO</td><td>TDE</td></tr></table>
 <br>
 <table style=''width:60%;'' border=''1''>
 <caption>Price Breakdown</caption>
 <tr style=''background-color: darkgray;text-align:right;''>
 <th style=''width:50%;text-align: center;''><b>Price</b></th>
 <th style=''width:30%;text-align: center;''><b>Difference</b></th></tr>
 <tr><td> Base Price</td><td style=''text-align:right;''>0.00</td></tr>
 <tr><td> Extras Price</td><td style=''text-align:right;''>43.98</td></tr>
 <tr><td> Total Discount</td><td style=''text-align:right;''>0.00</td></tr>
 <tr><td> Medical Price</td><td style=''text-align:right;''>0.00</td></tr>
 <tr><td> Postage</td><td style=''text-align:right;''>0.00</td></tr>
 <tr><td> Admin Fee</td><td style=''text-align:right;''>0.00</td></tr>
 <tr><td> Transaction Fee</td><td style=''text-align:right;''>0.00</td></tr>
 <tr><td> Auto Renewal Adjustment</td><td style=''text-align:right;''>0.00</td></tr>
 <tr><td> Stamp Duty</td><td style=''text-align:right;''>0.00</td></tr>
 <tr><td> Competitor Price Matching Discount</td><td style=''text-align:right;''>0.00</td></tr>
 <tr><td> Charge Adjustment</td><td style=''text-align:right;''>0.00</td></tr>
 <tr><td> Total Price</td><td style=''text-align:right;''>43.98</td></tr></table>
 <br/>
 <table style=''width:60%;'' border=''1''>
 <caption>Reason</caption><tr><td>Change Done in Web</td></tr>
 </table>
 <br/>') xml_data from dual
)
select
    x.class, x.caption
from
    tbl
cross join
    xmltable('/table/caption/tr'
        passing tbl.xml_data
        columns
            class varchar2(10) path '@class',
            caption varchar2(3) path 'caption[1]'
    ) x
where
    x.caption is not NULL;

, но это выдает ошибку

ORA-31011: XML parsing failed
ORA-19202: Error occurred in XML processing
LPX-00245: extra data after end of document
Error at line 5
ORA-06512: at "SYS.XMLTYPE", line 310
ORA-06512: at line 1

Может кто-нибудь указать мне, что я делаю не так

1 Ответ

2 голосов
/ 15 марта 2020

Ваш HTML недействителен XML.

  • У вас есть тег <br>, у которого нет соответствующего закрывающего тега; и
  • Ваш HTML является фрагментом, который не содержит ни одного элемента root.

Поставьте ведущий <html><body> и тренировку </body></html> и замените <br> с <br /> и исключение ORA-31011 исчезает.

with tbl as
(
    select xmltype('<html><body><table class="table table-striped " border=''1''>
 <caption>ACO Details</caption>
 <tr><th><b>Record</b></th><th><b>Changed ACO(s)</b></th></tr>
 <tr><td> Added   ACO</td><td>TDE</td></tr></table>
 <br />
 <table style=''width:60%;'' border=''1''>
 <caption>Price Breakdown</caption>
 <tr style=''background-color: darkgray;text-align:right;''>
 <th style=''width:50%;text-align: center;''><b>Price</b></th>
 <th style=''width:30%;text-align: center;''><b>Difference</b></th></tr>
 <tr><td> Base Price</td><td style=''text-align:right;''>0.00</td></tr>
 <tr><td> Extras Price</td><td style=''text-align:right;''>43.98</td></tr>
 <tr><td> Total Discount</td><td style=''text-align:right;''>0.00</td></tr>
 <tr><td> Medical Price</td><td style=''text-align:right;''>0.00</td></tr>
 <tr><td> Postage</td><td style=''text-align:right;''>0.00</td></tr>
 <tr><td> Admin Fee</td><td style=''text-align:right;''>0.00</td></tr>
 <tr><td> Transaction Fee</td><td style=''text-align:right;''>0.00</td></tr>
 <tr><td> Auto Renewal Adjustment</td><td style=''text-align:right;''>0.00</td></tr>
 <tr><td> Stamp Duty</td><td style=''text-align:right;''>0.00</td></tr>
 <tr><td> Competitor Price Matching Discount</td><td style=''text-align:right;''>0.00</td></tr>
 <tr><td> Charge Adjustment</td><td style=''text-align:right;''>0.00</td></tr>
 <tr><td> Total Price</td><td style=''text-align:right;''>43.98</td></tr></table>
 <br/>
 <table style=''width:60%;'' border=''1''>
 <caption>Reason</caption><tr><td>Change Done in Web</td></tr>
 </table>
 <br/></body></html>') xml_data from dual
)
SELECT x.class,
       x.caption
FROM   tbl
       CROSS JOIN
       XMLTABLE(
         '/html/body/table'
         PASSING tbl.xml_data
         COLUMNS
            class   VARCHAR2(50) PATH './@class',
            caption VARCHAR2(30) PATH './caption/text()'
       ) x;

выводит:

CLASS                | CAPTION        
:------------------- | :--------------
table table-striped  | ACO Details    
<em>null</em>                 | Price Breakdown
<em>null</em>                 | Reason         

db <> Fiddle здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...