path
của bạn đang tìm kiếm một td
dưới tr
; nhưng có hai, do đó bạn đang gặp lỗi "có chuỗi nhiều mục". Bạn có thể tham khảo từng td
gắn thẻ theo vị trí của nó, là td[1]
v.v ... Tuy nhiên, nó rất phụ thuộc vào cấu trúc bảng như mong đợi.
Với ví dụ cụ thể này, bạn có thể làm:
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
cái nào nhận được:
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
Mặc dù vậy, sẽ không cần nhiều biến thể trong HTML để phá vỡ nó. Xem câu trả lời này vì một số lý do, nó dễ vỡ và tại sao nó thường được coi là không khôn ngoan khi cố gắng phân tích cú pháp HTML thành XML.