Impostazione dello schema Oracle 11g R2 :
CREATE TABLE xml_data ( xml ) AS
SELECT XMLTYPE('
<ALFA>
<BETA>0123</BETA>
<GAMMA attribute1="value1">2345</GAMMA>
<DELTA attribute2="value2">
<EPSILON attribute3="value3" attribute4="value4">3</EPSILON>
</DELTA>
</ALFA>
')
FROM DUAL;
Query 1 :
select xpath, text
from xml_data d
CROSS JOIN
XMLTable(
'for $i in $doc/descendant-or-self::*
let $path := $i/string-join(ancestor-or-self::*/name(.), ''/'')
return <data>{attribute path {$path}, attribute value {$i/text()}}</data>'
PASSING d.xml AS "doc"
COLUMNS xpath varchar2(4000) path '/data/@path',
text varchar2(4000) path '/data/@value'
)
UNION ALL
select xpath, text
from xml_data d
CROSS JOIN
XMLTable(
'for $i in $doc/descendant-or-self::*
let $path := $i/string-join(ancestor-or-self::*/name(.), ''/'')
for $j in $i/attribute::*
return <data>{attribute path { concat( $path, "/@", $j/name(.) ) }, attribute value {$j}}</data>'
PASSING d.xml AS "doc"
COLUMNS xpath varchar2(4000) path '/data/@path',
text varchar2(4000) path '/data/@value'
)
| XPATH | TEXT |
|--------------------------------|--------|
| ALFA | (null) |
| ALFA/BETA | 0123 |
| ALFA/GAMMA | 2345 |
| ALFA/DELTA | (null) |
| ALFA/DELTA/EPSILON | 3 |
| ALFA/GAMMA/@attribute1 | value1 |
| ALFA/DELTA/@attribute2 | value2 |
| ALFA/DELTA/EPSILON/@attribute3 | value3 |
| ALFA/DELTA/EPSILON/@attribute4 | value4 |