简体   繁体   中英

XML file parsing in oracle

I did below step

CREATE directory XMLDIR AS 'C:\err_log';

SELECT * FROM example2;


INSERT INTO example2
       VALUES
       (
         xmltype
         (
           BFILENAME('XMLDIR', 'abc.xml'),
           NLS_CHARSET_ID('AL32UTF8')
         )
       );

This query

SELECT extract(OBJECT_VALUE, '/users/*/UserName/text()') FROM example2;

giving me result in one row

SureshDasariMaheshDasariMadhavYemineni

It should be like

SureshDasari MaheshDasari MadhavYemineni

XML file content

`<users>
          <user>
                   <FirstName>Suresh</FirstName>
                   <LastName>Dasari</LastName>
                   <UserName>SureshDasari</UserName>
                   <Job>Team Leader</Job>
          </user>
          <user>
                   <FirstName>Mahesh</FirstName>
                   <LastName>Dasari</LastName>
                   <UserName>MaheshDasari</UserName>
                   <Job>Software Developer</Job>
          </user>
          <user>
                   <FirstName>Madhav</FirstName>
                   <LastName>Yemineni</LastName>
                   <UserName>MadhavYemineni</UserName>
                   <Job>Business Analyst</Job>
          </user>
</users>

You can try the following

DECLARE
  temp_field varchar2(4000);
  x XMLType := XMLType(
    '<?xml version="1.0" ?> 
<users>
          <user>
                   <FirstName>Suresh</FirstName>
                   <LastName>Dasari</LastName>
                   <UserName>SureshDasari</UserName>
                   <Job>Team Leader</Job>
          </user>
          <user>
                   <FirstName>Mahesh</FirstName>
                   <LastName>Dasari</LastName>
                   <UserName>MaheshDasari</UserName>
                   <Job>Software Developer</Job>
          </user>
          <user>
                   <FirstName>Madhav</FirstName>
                   <LastName>Yemineni</LastName>
                   <UserName>MadhavYemineni</UserName>
                   <Job>Business Analyst</Job>
          </user>
</users>');
BEGIN
  FOR VAL_IN_XML IN (
    SELECT ExtractValue(Value(p),'/user/UserName/text()') as name
    FROM   TABLE(XMLSequence(Extract(x,'/users/user'))) p
    ) 
    Loop
    begin
        temp_field:=temp_field||' '||VAL_IN_XML.name;
    end;   
    end loop;
    ----Do ur requirement here
      insert into temp_table values(temp_field);--i'm just inserting in temp_table
        Execute immediate 'commit'; 

END;

Output i'm getting

SureshDasari MaheshDasari MadhavYemineni

Maybe it can be done simpler -

with t as
(select 
'<users>
          <user>
                   <FirstName>Suresh</FirstName>
                   <LastName>Dasari</LastName>
                   <UserName>SureshDasari</UserName>
                   <Job>Team Leader</Job>
          </user>
          <user>
                   <FirstName>Mahesh</FirstName>
                   <LastName>Dasari</LastName>
                   <UserName>MaheshDasari</UserName>
                   <Job>Software Developer</Job>
          </user>
          <user>
                   <FirstName>Madhav</FirstName>
                   <LastName>Yemineni</LastName>
                   <UserName>MadhavYemineni</UserName>
                   <Job>Business Analyst</Job>
          </user>
</users>' as xml_ 
  from dual)
select rtrim(xmlagg(xmlelement ("UserName", extractvalue(column_value,'/UserName') || ' ')).extract ('//text()'), ' ') as UserNames
  from t, table(xmlsequence(extract(XMLTYPE(t.xml_), '/users/*/UserName')))

In your case, it will look like this -

select rtrim(xmlagg(xmlelement ("UserName", extractvalue(column_value,'/UserName') || ' ')).extract ('//text()'), ' ') as UserNames
 from example2, table(xmlsequence(extract(OBJECT_VALUE, '/users/*/UserName')))

Update: If you want use xml data as parameter in procedure, you can do it like this -

procedure parse(xml_data_ in clob) is 
declare
 UserNames_ varchar2(4000);
begin

  select rtrim(xmlagg(xmlelement ("UserName", extractvalue(column_value,'/UserName') || ' ')).extract ('//text()'), ' ') as UserNames
   into UserNames_
   from table(xmlsequence(extract(XMLTYPE(xml_data_), '/users/*/UserName')));
end;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM