एक्सट्रेक्ट आपको ऊपर का रास्ता देखने देता है, लेकिन (जैसा कि एमओएस दस्तावेज़ 301709.1 में उल्लेख किया गया है; जो 9आई के लिए है लेकिन फिर भी दिखाई गई त्रुटि के अलावा मान्य लगता है):
तो आप 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
यदि आपको कुछ और जटिल चाहिए तो आप नोड स्तरों से जो कुछ भी चाहते हैं उसे खींच सकते हैं, जैसा कि इस उत्तर में दिखाया गया हैए>; लेकिन आपने जो कहा है, वह यहां अतिश्योक्तिपूर्ण है।