Cómo capturar/recuperar valores de un XML.

Cómo capturar/recuperar valores de un XML.

Postby FiveWiDi » Sat Nov 16, 2024 3:38 pm

Hola a todos,

A ver...
Mis conocimientos de informática son los que son, y me gustaría saber como hacen Ustedes para recuperar valores recibidos en un XML.

Yo paso todo el XML a una array de 3 elementos y después busco en esa array.

Por ejemplo para la respuesta de Verifactu, yo lo hago así:
Code: Select all  Expand view  RUN
/* *********************************************************************************** */
FUNCTION aVFLoadResponse( AMPAARRA, cPathFitxerXML, lPregunta )

// Es rep cPathFitxerXML amb el path sencer,

// aTagIter son TAGs iteratius i han d'estar ordenats alfabèticament.
Local aTagIter  := { { "/env:Envelope/env:Body/tikR:RespuestaRegFactuSistemaFacturacion/tikR:RespuestaLinea/", 0 }, ;
                     { "/env:Envelope/env:Body/tikR:RespuestaRegFactuSistemaFacturacion/tikR:RespuestaLinea/tikR:CodigoErrorRegistro/", 0 }, ;
                     { "/env:Envelope/env:Body/tikR:RespuestaRegFactuSistemaFacturacion/tikR:RespuestaLinea/tikR:DescripcionErrorRegistro/", 0 } ;
                   }
Local aXml      := {}
Local nContador := 0

aXml := LoadXml( 0, cPathFitxerXML, aTagIter )

/*
For nContador := 1 To Len( aXML )
    Traza( 1, aXML[nContador][1], " : " , aXML[nContador][2] )
End
*/

Return aXml
/* *********************************************************************************** */
 


Y después para asignar el valor recuperado busco en la array y cojo el valor.

-Para un valor NO iterativo.
Code: Select all  Expand view  RUN
cXmlDummy := "/env:Envelope/env:Body/env:Fault/faultcode/"
If ( nXml := AScan( aXML, { |eaXML| eaXml[1] = cXmlDummy } ) ) > 0

    cXmlDummy := "/env:Envelope/env:Body/env:Fault/faultstring/"
    nXml2 := AScan( aXML, { |eaXML| eaXml[1] = cXmlDummy } )


    lErrorEnvio := .T.
    nErrorEnvio := 10

    oTdbfVERFAC:VF_ESTAT := nVF_ESTAT_EnviamentErroni()
    oTdbfVERFAC:ESTAENVI := "Error en el envío."

    cNewVFErro( AMPAARRA, ;
                oTDbfVFErro, ;
                oTdbfVERFAC:CODIVEFA, ;
                Nil, ;
                Nil, ;
                If( nXml > 0, aXml[nXml][2], Nil ), ;
                If( nXml2 > 0, aXml[nXml2][2], Nil ) )
EndIf


-Para un valor iterativo:
Code: Select all  Expand view  RUN
   While lSetDbfFromVF_RespuestaLinea( AMPAARRA, oTdbfVERFAC, oTDbfVFRegi, oTdbfVFERRO, aXml, ++nItem )
    End


Donde...
Code: Select all  Expand view  RUN
/* *********************************************************************************** */
FUNCTION lSetDbfFromVF_RespuestaLinea( AMPAARRA, oTdbfVERFAC, oTDbfVFRegi, oTdbfVFERRO, aXml, nItemRL )

Local lResposta := .F.
Local cItem_A   := "/env:Envelope/env:Body/tikR:RespuestaRegFactuSistemaFacturacion/tikR:RespuestaLinea"
Local cItem_B   := "/tikR:IDFactura/tik:NumSerieFactura/"
Local cItem_C   := ""
Local nXmlRL    := 0
Local nXml      := 0
Local nItem     := 0

cItem_A := cItem_A + "<" + AllTrim(Str( nItemRL, 10, 0 ) ) + ">"
cItem_C := cItem_A + cItem_B

If ( nXmlRL := AScan( aXML, { |eaXmlRL| eaXmlRL[1] = cItem_C } ) ) > 0

        cItem_B  := "/tikR:EstadoRegistro/"
        cItem_C := cItem_A + cItem_B

      // Una captura NO iterativa dentro de ESTA iterativa.
        If ( nXml := AScan( aXML, { |eaXML| eaXml[1] = cItem_C } ) ) > 0
            oTDbfVFRegi:ESTAREGI := aXml[nXml][2]
        EndIf

        oTDbfVFRegi:VF_ESTAT := nVF_ESTAT_Acabat()

       // Una captura ITERATIVA  dentro de ESTA iteración.
        While lSetDbfFromVF_ErrorRegistro( AMPAARRA, oTdbfVERFAC, oTDbfVFRegi, oTdbfVFERRO, aXml, cItem_A, ++nItem )
            oTDbfVFRegi:VF_ESTAT := nVF_ESTAT_Erroni()
        End

      // Una captura NO iterativa dentro de ESTA iterativa.
        cItem_B  := "/tikR:RegistroDuplicado/tik:IdPeticionRegistroDuplicado/"
        cItem_C := cItem_A + cItem_B
        If ( nXml := AScan( aXML, { |eaXML| eaXml[1] = cItem_C } ) ) > 0
            oTDbfVFRegi:IDPETICI := aXml[nXml][2]
        EndIf

        oTDbfVFRegi:Save()
        lResposta := .T.
    EndIf
EndIf

Return lResposta
/* *********************************************************************************** */


Es que desde hace tiempo tengo la curiosidad de saber como lo hacen otros.

Muchas gracias
Un Saludo
Carlos G.

FiveWin 24.02 + Harbour 3.2.0dev (r2403071241), BCC 7.7 Windows 10
FiveWiDi
 
Posts: 1190
Joined: Mon Oct 10, 2005 2:38 pm

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 92 guests