あなたのpath
td
を探しています tr
の下;しかし、2つあるため、「複数アイテムのシーケンスを取得しました」というエラーが表示されます。各td
を参照できます td[1]
のように、位置でタグを付けます など。ただし、テーブル構造が期待どおりであることに大きく依存しています。
この特定の例を使用すると、次のことができます。
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
取得:
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
ただし、HTMLを壊すのにそれほど変化はありません。 この回答を参照 いくつかの理由でそれは壊れやすく、HTMLをXMLとして解析しようとするのが一般的に賢明でないと考えられている理由です。