Hola,
Ahí va una versión revisada para que tome TAGs con estructuras repetitivas como
<Iva></Iva>
SaludosMauricio
** ejemplo en VFP de como a partir de una estructura XML* generar un objeto
jerarquico* usando "MSXML.DOMDocument"** Mauricio Pistiner** Versión revisada
para que tome estructuras repetitivas*LOCAL o
o = CREATEOBJECT('RespuestaAFIP')o.cXML = o.Mock_XML()o.ProcesarRespuesta()
WITH
o.soap_envelope.soap_body.fecompconsultarresponse.fecompconsultarresult.ResultGet
IF .Resultado.Valor ='A' ? 'Concepto = '+.Concepto.Valor ? 'DocTipo =
'+.DocTipo.Valor ? 'ImpTotal = '+.ImpTotal.Valor ? 'ImpTotConc =
'+.ImpTotConc.Valor ? 'Concepto = '+.Concepto.Valor ? 'DocTipo =
'+.DocTipo.Valor ? 'DocNro = '+.DocNro.Valor ? 'CbteDesde = '+.CbteDesde.Valor
? 'CbteHasta = '+.CbteHasta.Valor ? 'CbteFch = '+.CbteFch.Valor ? 'ImpTotal =
'+.ImpTotal.Valor ? 'ImpTotConc = '+.ImpTotConc.Valor ? 'ImpNeto =
'+.ImpNeto.Valor ? 'ImpOpEx = '+.ImpOpEx.Valor ? 'ImpTrib = '+.ImpTrib.Valor ?
'ImpIVA = '+.ImpIVA.Valor ? 'FchServDesde = '+.FchServDesde.Valor ?
'FchServHasta = '+.FchServHasta.Valor ? 'FchVtoPago = '+.FchVtoPago.Valor ?
'MonId = '+.MonId.Valor ? 'MonCotiz = '+.MonCotiz.Valor ? ? 'Array IVA' nOrd =
IIF(PEMSTATUS(.iva,'AlicIva1',5),1,0) DO WHILE TYPE('.iva') = 'O' AND
PEMSTATUS(.iva,ALLTRIM('AlicIva'+TRANSFORM(nOrd,'@Z 9')),5) ?
'IvaAlic'+TRANSFORM(nOrd,'@Z 9') WITH
EVALUATE('.iva.AlicIva'+TRANSFORM(nOrd,'@Z 9')) ? CHR(9)+' Id = '+.ID.Valor ?
CHR(9)+' BaseImp = '+.BaseImp.Valor ? CHR(9)+' Importe = '+.Importe.Valor
ENDWITH ? nOrd = nOrd +1 ENDDO
* * ... * ENDIFENDWITH
*********************DEFINE CLASS RespuestaAfip AS SESSION
cXML = ''
******************** * PROCEDURE ProcesarRespuesta LOCAL cText, oXML, cValores
oXML = CREATEOBJECT("MSXML.DOMDocument")
IF oXML.LOADXML(THIS.cXML) THIS.ProcesaNodos(oXML.childNodes,THIS) ENDIF
ENDPROC
******************** * PROCEDURE ProcesaNodos LPARAMETERS Nodos AS
MSXML.IXMLDOMNodeList, oObj LOCAL oNodo AS MSXML.IXMLDOMNode, cNombre,
cNombreX, nOrd
#DEFINE NODE_ELEMENT 1 #DEFINE NODE_ATTRIBUTE 2 #DEFINE NODE_TEXT 3
FOR EACH oNodo IN Nodos IF oNodo.nodeType = NODE_TEXT
ADDPROPERTY(oObj,'Valor',TRANSFORM(oNodo.nodeValue)) ENDIF IF
oNodo.hasChildNodes cNombre = STRTRAN(oNodo.nodeName,':','_')
* resuelvo si existe un array *** cNombreX = cNombre nOrd = 1 DO WHILE
PEMSTATUS(oObj,cNombreX,5) OR PEMSTATUS(oObj,cNombreX+TRANSFORM(nOrd),5) IF
nOrd = 1 AND !PEMSTATUS(oObj,cNombreX+'1',5) ADDPROPERTY(oObj,cNombre+
TRANSFORM(nOrd),EVALUATE('oObj.'+cNombre)) REMOVEPROPERTY(oObj,cNombre) ENDIF
nOrd = nOrd + 1 cNombreX = cNombre + TRANSFORM(nOrd) ENDDO IF nOrd > 1 cNombre
= cNombre + TRANSFORM(nOrd) ENDIF * resuelvo arrays ***
ADDPROPERTY(oObj,cNombre,CREATEOBJECT('empty')) THIS.ProcesaNodos(
oNodo.childNodes, EVALUATE('oObj.'+cNombre)) ENDIF ENDFOR
ENDPROC
******************** * PROCEDURE Mock_XML LOCAL cText
TEXT TO cText NOSHOW<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <soap:Body>
<FECompConsultarResponse xmlns="http://ar.gov.afip.dif.FEV1/">
<FECompConsultarResult> <ResultGet>
<Concepto>2</Concepto> <DocTipo>80</DocTipo>
<DocNro>30999999997</DocNro> <CbteDesde>1</CbteDesde>
<CbteHasta>1</CbteHasta> <CbteFch>20150628</CbteFch>
<ImpTotal>33.15</ImpTotal> <ImpTotConc>0</ImpTotConc>
<ImpNeto>20</ImpNeto> <ImpOpEx>10</ImpOpEx>
<ImpTrib>0</ImpTrib> <ImpIVA>3.15</ImpIVA>
<FchServDesde>20150601</FchServDesde>
<FchServHasta>20150630</FchServHasta>
<FchVtoPago>20150630</FchVtoPago> <MonId>PES</MonId>
<MonCotiz>1</MonCotiz> <Iva> <AlicIva>
<Id>4</Id> <BaseImp>10</BaseImp>
<Importe>1.05</Importe> </AlicIva>
<AlicIva> <Id>5</Id>
<BaseImp>10</BaseImp> <Importe>2.1</Importe>
</AlicIva> <AlicIva> <Id>3</Id>
<BaseImp>10</BaseImp> <Importe>0</Importe>
</AlicIva> </Iva>
<Resultado>A</Resultado>
<CodAutorizacion>99999999999999</CodAutorizacion>
<EmisionTipo>CAE</EmisionTipo> <FchVto>20151212</FchVto>
<FchProceso>20150628160914</FchProceso> <PtoVta>5</PtoVta>
<CbteTipo>1</CbteTipo> </ResultGet>
</FECompConsultarResult> </FECompConsultarResponse>
</soap:Body></soap:Envelope>ENDTEXT
RETURN cText
ENDPROC
ENDDEFINE
El Lunes, 6 de julio, 2015 16:48:44, Mario Andrés Ageno
<[email protected]> escribió:
Gracias Mauricio From: Mauricio Pistiner Sent: Sunday, July 05, 2015 10:24
PMTo: GUFA List Member Subject: [GUFA] Factura Electrónica - Leer respuesta XML
Hola, Sobre como leer la respuesta XML de Factura Electrónica una alternativa a
STREXTRACT es trabajar con el objeto MSXML.DOMDocumentLes paso un ejemplo en
como se puede hacer un objeto jerárquico que respete la estructura del XML y
revisar sus valores SaludosMauricio ** ejemplo en VFP de como a partir de una
estructura XML* generar un objeto jerarquico* usando "MSXML.DOMDocument"*
Mauricio Pistiner*LOCAL o o = CREATEOBJECT('RespuestaAFIP')o.cXML =
o.Mock_XML()o.ProcesarRespuesta() WITH
o.soap_envelope.soap_body.fecompconsultarresponse.fecompconsultarresult.ResultGet?
'Concepto = '+.Concepto.Valor? 'DocTipo = '+.DocTipo.Valor? 'ImpTotal =
'+.ImpTotal.Valor? 'ImpTotConc = '+.ImpTotConc.Valor? 'Concepto =
'+.Concepto.Valor? 'DocTipo = '+.DocTipo.Valor? 'DocNro = '+.DocNro.Valor?
'CbteDesde = '+.CbteDesde.Valor? 'CbteHasta = '+.CbteHasta.Valor? 'CbteFch =
'+.CbteFch.Valor? 'ImpTotal = '+.ImpTotal.Valor? 'ImpTotConc =
'+.ImpTotConc.Valor? 'ImpNeto = '+.ImpNeto.Valor? 'ImpOpEx = '+.ImpOpEx.Valor?
'ImpTrib = '+.ImpTrib.Valor? 'ImpIVA = '+.ImpIVA.Valor? 'FchServDesde =
'+.FchServDesde.Valor? 'FchServHasta = '+.FchServHasta.Valor? 'FchVtoPago =
'+.FchVtoPago.Valor? 'MonId = '+.MonId.Valor? 'MonCotiz = '+.MonCotiz.Valor**
...*ENDWITH *********************DEFINE CLASS RespuestaAfip AS SESSION cXML =
'' *********************PROCEDURE INIT ENDPROC *********************PROCEDURE
ProcesarRespuestaLOCAL cText, oXML, cValores oXML =
CREATEOBJECT("MSXML.DOMDocument") IF
oXML.LOADXML(THIS.cXML)THIS.ProcesaNodos(oXML.childNodes,THIS)ENDIF ENDPROC
*********************PROCEDURE ProcesaNodosLPARAMETERS Nodos AS
MSXML.IXMLDOMNodeList, oObjLOCAL oNodo AS MSXML.IXMLDOMNode, cNombre #DEFINE
NODE_ELEMENT 1#DEFINE NODE_ATTRIBUTE 2#DEFINE NODE_TEXT 3 FOR EACH oNodo IN
NodosIF oNodo.nodeType =
NODE_TEXTADDPROPERTY(oObj,'Valor',TRANSFORM(oNodo.nodeValue))ENDIFIF
oNodo.hasChildNodescNombre =
STRTRAN(oNodo.nodeName,':','_')ADDPROPERTY(oObj,cNombre,CREATEOBJECT('empty'))THIS.ProcesaNodos(
oNodo.childNodes, EVALUATE('oObj.'+cNombre))ENDIFENDFOR ENDPROC
*********************PROCEDURE Mock_XMLLOCAL cText TEXT TO cText
NOSHOW<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <soap:Body>
<FECompConsultarResponse xmlns="http://ar.gov.afip.dif.FEV1/">
<FECompConsultarResult> <ResultGet>
<Concepto>2</Concepto> <DocTipo>80</DocTipo>
<DocNro>30999999997</DocNro> <CbteDesde>1</CbteDesde>
<CbteHasta>1</CbteHasta> <CbteFch>20150628</CbteFch>
<ImpTotal>33.15</ImpTotal> <ImpTotConc>0</ImpTotConc>
<ImpNeto>20</ImpNeto> <ImpOpEx>10</ImpOpEx>
<ImpTrib>0</ImpTrib> <ImpIVA>3.15</ImpIVA>
<FchServDesde>20150601</FchServDesde>
<FchServHasta>20150630</FchServHasta>
<FchVtoPago>20150630</FchVtoPago> <MonId>PES</MonId>
<MonCotiz>1</MonCotiz> <Iva> <AlicIva>
<Id>4</Id> <BaseImp>10</BaseImp>
<Importe>1.05</Importe> </AlicIva>
<AlicIva> <Id>5</Id>
<BaseImp>10</BaseImp> <Importe>2.1</Importe>
</AlicIva> </Iva> <Resultado>A</Resultado>
<CodAutorizacion>99999999999999</CodAutorizacion>
<EmisionTipo>CAE</EmisionTipo> <FchVto>20151212</FchVto>
<FchProceso>20150628160914</FchProceso> <PtoVta>5</PtoVta>
<CbteTipo>1</CbteTipo> </ResultGet>
</FECompConsultarResult> </FECompConsultarResponse>
</soap:Body></soap:Envelope>ENDTEXT RETURN cText ENDPROC ENDDEFINE