sql >> Databasteknik >  >> RDS >> Oracle

Analysera HTML-tabell med Oracle

Din path letar efter en td under tr; men det finns två, därav felet "har flera objekt sekvens" du ser. Du kan referera till varje td tagga efter sin position, som td[1] etc. Det är dock mycket beroende av att tabellstrukturen är som förväntat.

Med detta specifika exempel kan du göra:

with tbl as
(
    select xmltype('
        <table>
          <tbody>
            <tr class="blue"><td>code</td><td>rate</td></tr>
            <tr class="gray_1"><td><span>USD</span><em>1</em></td><td>476.16</td></tr>
            <tr class="gray_2"><td><span>AUD</span><em>1</em></td><td>327.65</td></tr>
            <tr class="gray_9"><td><span>IRR</span><em>100</em></td><td>1.13</td></tr>
            <tr class="blue"><td>some comment</td><td>some comment</td></tr>
            <tr class="gray_1"><td><span>EUR</span><em>1</em></td><td>526.54</td></tr>
          </tbody>
        </table>
    ') xml_data from dual
)
select
    x.class, x.currency, x.amount, to_number(x.rate) as rate
from
    tbl
cross join
    xmltable('/table/tbody/tr'
        passing tbl.xml_data
        columns
            class varchar2(10) path '@class',
            currency varchar2(3) path 'td[1]/span',
            amount number path 'td[1]/em',
            rate varchar2(50) path 'td[2]'
    ) x
where
    x.currency is not null

som får:

CLASS      CUR     AMOUNT       RATE
---------- --- ---------- ----------
gray_1     USD          1     476.16
gray_2     AUD          1     327.65
gray_9     IRR        100       1.13
gray_1     EUR          1     526.54

Det kommer inte att krävas mycket variation i HTML för att bryta den. Se det här svaret av vissa anledningar är den ömtålig, och varför det allmänt anses vara oklokt att försöka tolka HTML som XML.




  1. SQL Server Slumpvis sortering

  2. NAME_IN inbyggt i Oracle D2k Forms

  3. Skript för att skapa Mysql-användare

  4. sql-fråga för att returnera skillnader mellan två tabeller