Oracle
 sql >> Base de données >  >> RDS >> Oracle

Analyser une table HTML avec Oracle

Votre path recherche un td sous le tr; mais il y en a deux, d'où l'erreur "séquence multi-éléments obtenue" que vous voyez. Vous pouvez référencer chaque td tag par sa position, comme td[1] etc. Cependant, cela dépend beaucoup de la structure de la table comme prévu.

Avec cet exemple spécifique, vous pouvez faire :

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

qui obtient :

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

Cependant, il ne faudra pas beaucoup de variation dans le HTML pour le casser. Voir cette réponse pour certaines raisons, il est fragile, et pourquoi il est généralement considéré comme imprudent d'essayer d'analyser HTML en XML.