Forum Stats

  • 3,874,451 Users
  • 2,266,734 Discussions
  • 7,911,852 Comments

Discussions

XMLSequence EXTRACT HEAD and DETAIL in ORACLE 9.2

1019748
1019748 Member Posts: 2
edited Jun 27, 2013 10:51AM in XQuery

Hi, sorry about my english i am from argentine.

I have this XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<arrayOfServicio >

    <Servicio>

        <Nombre>Autenticacion</Nombre>

        <Descripcion>ws</Descripcion>

        <Activo>true</Activo>

        <Version>1.0</Version>

        <MetodosEntity>

            <Metodo>

                <Nombre>RequestTicket</Nombre>

                <Activo>true</Activo>

                <Version>1.0</Version>

            </Metodo>

        </MetodosEntity>

    </Servicio>

    <Servicio>

        <Nombre>Consultas</Nombre>

        <Descripcion>wsConsultas</Descripcion>

        <Activo>true</Activo>

        <Version>1.0</Version>

        <MetodosEntity>

            <Metodo>

                <Nombre>GetVigencia</Nombre>

                <Activo>true</Activo>

                <Version>1.0</Version>

            </Metodo>

            <Metodo>

                <Nombre>GetSiniestralidad</Nombre>

                <Activo>true</Activo>

                <Version>1.0</Version>

            </Metodo>

            <Metodo>

                <Nombre>GetAgrupados</Nombre>

                <Activo>true</Activo>

                <Version>1.0</Version>

            </Metodo>

            <Metodo>

                <Nombre>GetSiniestralidadPorCuil</Nombre>

                <Activo>true</Activo>

                <Version>1.0</Version>

            </Metodo>

        </MetodosEntity>

    </Servicio>

    <Servicio>

        <Nombre>Referencias</Nombre>

        <Descripcion>wsReferencias</Descripcion>

        <Activo>true</Activo>

        <Version>1.0</Version>

        <MetodosEntity>

            <Metodo>

                <Nombre>TablaReferencia</Nombre>

                <Activo>true</Activo>

                <Version>1.0</Version>

            </Metodo>

            <Metodo>

                <Nombre>ListadoReferencia</Nombre>

                <Activo>true</Activo>

                <Version>1.0</Version>

            </Metodo>

        </MetodosEntity>

    </Servicio>

    <Servicio>

        <Nombre>General</Nombre>

        <Descripcion>WsGeneral</Descripcion>

        <Activo>true</Activo>

        <Version>1.0</Version>

        <MetodosEntity>

            <Metodo>

                <Nombre>GetServicios</Nombre>

                <Activo>true</Activo>

                <Version>1.0</Version>

            </Metodo>

        </MetodosEntity>

    </Servicio>

    <Servicio>

        <Nombre>eServicios</Nombre>

        <Descripcion>wseServicios</Descripcion>

        <Activo>true</Activo>

        <Version>1.0</Version>

        <MetodosEntity>

            <Metodo>

                <Nombre>SetComunicacion</Nombre>

                <Activo>true</Activo>

                <Version>1.0</Version>

            </Metodo>

        </MetodosEntity>

    </Servicio>

    <Servicio>

        <Nombre>VentanillaART</Nombre>

        <Descripcion>wsVentanillaART</Descripcion>

        <Activo>true</Activo>

        <Version>1.0</Version>

        <MetodosEntity>

            <Metodo>

                <Nombre>ObtenerNovedades</Nombre>

                <Activo>true</Activo>

                <Version>1.0</Version>

            </Metodo>

        </MetodosEntity>

    </Servicio>

    <Servicio>

        <Nombre>Establecimientos</Nombre>

        <Descripcion>wsEstablecimiento</Descripcion>

        <Activo>true</Activo>

        <Version>1.0</Version>

        <MetodosEntity>

            <Metodo>

                <Nombre>GetConsultaPorCuit</Nombre>

                <Activo>true</Activo>

                <Version>1.0</Version>

            </Metodo>

        </MetodosEntity>

    </Servicio>

</arrayOfServicio>

I am working in ORACLE 9.2 and i wrote this query but the result is not correct, i need to join HEAD and DETAIL in some way but cannot do that...

  select extractvalue(value(head),'//Servicio/Nombre/text()') ,

        extractvalue(value(head),'//Servicio/Descripcion/text()'),

        extractvalue(value(head),'//Servicio/Activo/text()'),

        extractvalue(value(head),'//Servicio/Version/text()')

        ,extractvalue(value(detail),'//Metodo/Nombre/text()')

        ,extractvalue(value(detail),'//Metodo/Activo/text()')

        ,extractvalue(value(detail),'//Metodo/Version/text()')

  from arwt_ws_return x

      , table(xmlsequence(extract (x.x_xmldoc, '/arrayOfServicio/Servicio'))) head

      , table(xmlsequence(extract (x.x_xmldoc, '/arrayOfServicio/Servicio/MetodosEntity/Metodo'))) detail;

Ii really appreciate your help.

Thanks!

Tagged:

Best Answer

  • odie_63
    odie_63 Member Posts: 8,493 Silver Trophy
    Answer ✓

    Hi,

    You can do that by passing the head element to the second XMLSequence. That way you maintain the correlation between the parent and its children :

    select extractvalue(value(head), '/Servicio/Nombre') as srv_nombre
         , extractvalue(value(head), '/Servicio/Descripcion') as srv_desc
         , extractvalue(value(head), '/Servicio/Activo') as srv_activo
         , extractvalue(value(head), '/Servicio/Version') as srv_version
         , extractvalue(value(detail), '/Metodo/Nombre') as met_nombre
         , extractvalue(value(detail), '/Metodo/Activo') as met_activo
         , extractvalue(value(detail), '/Metodo/Version') as met_version
    from arwt_ws_return x
       , table(xmlsequence(extract(x.x_xmldoc, '/arrayOfServicio/Servicio'))) head
       , table(xmlsequence(extract(value(head), '/Servicio/MetodosEntity/Metodo'))) detail
    ;
    

    Please also note that :

    - you don't need a descendant axis (//) if you know the exact path

    - you don't need to go down to the text() node if you're using extractvalue

    Hope that helps.

Answers

  • odie_63
    odie_63 Member Posts: 8,493 Silver Trophy
    Answer ✓

    Hi,

    You can do that by passing the head element to the second XMLSequence. That way you maintain the correlation between the parent and its children :

    select extractvalue(value(head), '/Servicio/Nombre') as srv_nombre
         , extractvalue(value(head), '/Servicio/Descripcion') as srv_desc
         , extractvalue(value(head), '/Servicio/Activo') as srv_activo
         , extractvalue(value(head), '/Servicio/Version') as srv_version
         , extractvalue(value(detail), '/Metodo/Nombre') as met_nombre
         , extractvalue(value(detail), '/Metodo/Activo') as met_activo
         , extractvalue(value(detail), '/Metodo/Version') as met_version
    from arwt_ws_return x
       , table(xmlsequence(extract(x.x_xmldoc, '/arrayOfServicio/Servicio'))) head
       , table(xmlsequence(extract(value(head), '/Servicio/MetodosEntity/Metodo'))) detail
    ;
    

    Please also note that :

    - you don't need a descendant axis (//) if you know the exact path

    - you don't need to go down to the text() node if you're using extractvalue

    Hope that helps.

  • 1019748
    1019748 Member Posts: 2

    Thank you so much Odie.

    That really helps!

This discussion has been closed.