I am trying to parse xml in my oracle DB to return individual rows. The xml is a field called msg in my table Sample xml is
<application xmlns="http://www.abcxyz.com/Schema/FCX/1"
xmlns:xs="http://www.w3.org/2001/XMLSchema-instance">
<client>
<clientSource>
<amount>25000.0</amount>
<clientSourceTypeDd>1</clientSourceTypeDd>
<description>aasdadsf</description>
</clientSource>
<clientSource>
<amount>25000.0</amount>
<clientSourceType>6</clientSourceTypeDd>
<description>wrewertwerewrt</description>
</clientSource>
<clientSource>
<amount>50000.0</amount>
<clientSourceType>10</clientSourceTypeDd>
<description>second and thirs</description>
</clientSource>
</client>
</application>
I have tried the below query but not working as expected
SELECT EXTRACT(t.msg, '//application/client/clientSource[*]/clientSourceType/text()')
.getStringVal() clientSourceType,
EXTRACT(t.msg, '/pplication/client/clientSource/amount')
.getStringVal() clientSourceAmount
FROM table t
The expected result I want to achieve is
clientSourceType | clientSourceAmount |
---|---|
1 | 25000 |
6 | 25000 |
10 | 50000 |
Please help resolve as I am new to parse xml and oracle. Thanks
CodePudding user response:
You can use XMLTABLE
, which is recommended by Oracle rather than deprecated function EXTRACTVALUE
, after fixing tag names by converting clientSourceTypeDd
to clientSourceType
in order to make opening and closing tag names match such as
WITH t( xml ) AS
(
SELECT XMLType('<application xmlns="http://www.abcxyz.com/Schema/FCX/1"
xmlns:xs="http://www.w3.org/2001/XMLSchema-instance">
<client>
<clientSource>
<amount>25000.0</amount>
<clientSourceType>1</clientSourceType>
<description>aasdadsf</description>
</clientSource>
<clientSource>
<amount>25000.0</amount>
<clientSourceType>6</clientSourceType>
<description>wrewertwerewrt</description>
</clientSource>
<clientSource>
<amount>50000.0</amount>
<clientSourceType>10</clientSourceType>
<description>second and thirs</description>
</clientSource>
</client>
</application>')
FROM dual
)
SELECT "clientSourceType", "clientSourceAmount"
FROM t,
XMLTABLE( XMLNAMESPACES( DEFAULT 'http://www.abcxyz.com/Schema/FCX/1' ),
'/application/client/clientSource'
PASSING xml
COLUMNS
"clientSourceType" INT PATH 'clientSourceType',
"clientSourceAmount" INT PATH 'amount'
)
clientSourceType | clientSourceAmount |
---|---|
1 | 25000 |
6 | 25000 |
10 | 50000 |