Екстрактът ви позволява да търсите по-нагоре по пътя, но (както е отбелязано в MOS документ 301709.1; който е за 9i, но все още изглежда валиден, с изключение на показаната грешка):
Така че не можете да използвате name()
, local-name()
и т.н. функции, на текущия или родителския възел. В този документ има нещо като заобиколно решение, което може да бъде леко опростено от техния пример до:
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()
Демо с двете:
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>
Но extract()
така или иначе е отхвърлено
. Можете да направите това с 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
Ако имате нужда от нещо по-сложно, можете да изтеглите каквото ви трябва от нивата на възлите, както е показано в този отговор; но от това, което казахте, тук е пресилено.