Giải nén cho phép bạn tìm kiếm đường dẫn cao hơn, nhưng (như đã lưu ý trong tài liệu MOS 301709.1; dành cho 9i nhưng vẫn có vẻ hợp lệ, ngoại trừ lỗi được hiển thị):
Vì vậy, bạn không thể sử dụng name()
, local-name()
vv các chức năng, trên nút hiện tại hoặc nút cha. Có một cách giải quyết các loại trong tài liệu đó, có thể được đơn giản hóa một chút từ ví dụ của chúng thành:
EXTRACT(xmltype(d.data), '//ns1:myId/..',
'xmlns:ns1="http://acme.com/').getRootElement() xml2
Hoặc ở một hình thức hơi khác:
xmltype(d.data).extract('//ns1:myId/..',
'xmlns:ns1="http://acme.com/').getRootElement()
Demo với cả hai:
with data (pid, name, data) as (
select 42, 'Test', '<?xml version="1.0" encoding="ISO-8859-1"?>
<ns1:root xmlns:ns1="http://acme.com/"><ns1:parent><ns1:myId>1234</ns1:myId></ns1:parent></ns1:root>' from dual
)
select d.pid, d.name
, EXTRACT(xmltype(d.data), '//ns1:myId', 'xmlns:ns1="http://acme.com/') xml
, EXTRACT(xmltype(d.data), '//ns1:myId/..', 'xmlns:ns1="http://acme.com/').getRootElement() xml2
, xmltype(d.data).extract('//ns1:myId/..', 'xmlns:ns1="http://acme.com/').getRootElement() xml3
from DATA d
order by d.pid desc
;
PID NAME XML XML2 XML3
---------- ---- ------------------------------ ---------- ----------
42 Test <ns1:myId xmlns:ns1="http://ac parent parent
me.com/">1234</ns1:myId>
Nhưng extract()
vẫn không được dùng nữa
. Bạn có thể thực hiện việc này với XMLTable
:
with data (pid, name, data) as (
select 42, 'Test', '<?xml version="1.0" encoding="ISO-8859-1"?>
<ns1:root xmlns:ns1="http://acme.com/"><parent><myId>1234</myId></parent></ns1:root>' from dual
)
select d.pid, d.name, x.*
from data d
cross join xmltable(xmlnamespaces('http://acme.com/' as "ns1"),
'/ns1:*//myId'
passing xmltype(d.data)
columns myId number path '.',
parent varchar2(20) path './../local-name()'
) x
order by d.pid desc;
PID NAME MYID PARENT
---------- ---- ---------- --------------------
42 Test 1234 parent
Nếu bạn cần thứ gì đó phức tạp hơn, bạn có thể lấy bất cứ thứ gì bạn cần từ các cấp nút, như được hiển thị trong câu trả lời này ; nhưng từ những gì bạn đã nói ở đây là quá mức cần thiết.