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
- /* *********************************************************************************** */
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
- 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
- While lSetDbfFromVF_RespuestaLinea( AMPAARRA, oTdbfVERFAC, oTDbfVFRegi, oTdbfVFERRO, aXml, ++nItem )
End
Donde...
- Code: Select all Expand view
- /* *********************************************************************************** */
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