viernes, 30 de enero de 2015

Usando mxml


Debido a los problemas de memoria usando la clase TXMLDocument, he decidido usar directamente la librería mxml.

Pongo un ejemplo de COMO se obtienen los datos a partir de una cadena que contiene el XML.

Parece una tonteria, pero no he encontrado un ejemplo tan simple como esto.
Espero os ayude 


function read_xml()
  Local htree, hNode, cType, hTarifa, hNext, hDias, hDia, hHab, hPrecios
  Local xml := [<?xml version="1.0" encoding="UTF-8"?> ]+;
                [<Precios>]+;
                [    <Tarifa Codigo="BAR" Tipo="DIARIO" ImpuestosIncluidos="true" >]+;
                [        <Habitacion Tipo="DOB1" PAX="1">]+;
                [            <DIAS>]+;
                [                <Dia Precio="1" Fecha="01-08-2013" Estado="A"/>]+;
                [                <Dia Precio="2" Fecha="02-08-2013" Estado="C"/>]+;
                [            </DIAS>]+;
                [        </Habitacion>]+;
                [        <Habitacion Tipo="DOB2" PAX="2">]+;
                [            <DIAS>]+;
                [                <Dia Precio="3.1415" Fecha="01-08-2013" Estado="A"/>]+;
                [                <Dia Precio="3.1415" Fecha="02-08-2013" Estado="A"/>]+;
                [            </DIAS>]+;
                [        </Habitacion>]+;
                [    </Tarifa>]+;
                [</Precios>]

      hTree = mxmlLoadString( nil, xml )

      IF Empty( hTarifa := mxmlFindElement( hTree, hTree, "Tarifa",,, MXML_DESCEND ) )
         OutErr( "Unable to find first <tarifas> element in XML tree!" + hb_eol() )

         mxmlDelete( hTree )
         ErrorLevel( 1 )
         QUIT
      endif  

      Alert( "Tarifa coger atributos:"+ mxmlGetElement( hTarifa )   )
      Alert( "Codigo Tarifa.:" + mxmlElementGetAttr( hTarifa, "Codigo" ) + hb_osnewline() + ;
             "Tipo de Tarifa:" + mxmlElementGetAttr( hTarifa, "Tipo" )   + hb_osnewline() +;
             "Impuestos.....:" + mxmlElementGetAttr( hTarifa, "ImpuestosIncluidos" ) )
    
       hNext := mxmlWalkNext( hTarifa, hTree, MXML_DESCEND )   // Cogo habitacion1 porque hTarifa es el nodo principal
       while hNext != NIL
             Alert( "Hab:" + mxmlElementGetAttr( hNext, "Tipo" ) )
             hDias := mxmlWalkNext( hNext, hTree, MXML_DESCEND )        // Cojo nodo DIAS, descendiendo un nivel
                   hDia  := mxmlWalkNext( hDias, hTree, MXML_DESCEND )  // Cojo nodo DIA , descendiendo un nivel
                   while hDia != NIL
                         alert( "DIA :" + mxmlGetElement( hDia ) + "-->" + mxmlElementGetAttr( hDia, "Precio" )  )
                         alert("      " + mxmlGetElement( hDia ) + "-->" + mxmlElementGetAttr( hDia, "Fecha" )  )
                         alert("      " + mxmlGetElement( hDia ) + "-->" + mxmlElementGetAttr( hDia, "Estado" )  )
                         hDia := mxmlGetNextSibling( hDia ) // Siguiente Node dia, al mismo NIVEL
                   end while     

             hNext := mxmlGetNextSibling( hNext ) // El siguiente nodo es la habitacion, mismo NIVEL
       end while

    alert( "mira:" + MXMLSAVEALLOCSTRING( hTree ))
    mxmlDelete( hTree )

return nil

1 comentario:

  1. Hola, estoy teniendo inconveniente al querer leer un atributo llamado "Año". Debo poner algo extra para corregirlo?
    Saludos.

    ResponderEliminar

Android y Git. Disponer del hash automáticamente.

Una de las cosas a las que estoy acostumbrado, es tener siempre en mi código, el hash/tag/versión del control de versiones que estoy usan...