Al utilizar la librería mxml de harbour para generar ficheros xml con la finalidad de poder intercambiar mensajes xml con la AEAT (Agencia Tributaria española) mediante el Web Service he tenido que dedicar bastante tiempo debido a que la AEAT da como erroneos los xml generados con esta librería de Harbour porque introduce _ CRLF que a la AEAT no le gustan.
El código utilizado es:
Code: Select all
function xml_test_gen()
local cFichSalida:="TEST_XML.xml"
local xml, root, header, body, Declarante
local oXml // Para comprobar al final que el xml generado se puede parsear.
xml := mxmlNewXML() // Sin argumentos asume que es la "1.0"
root := mxmlNewElement( xml, "soapenv:Envelope" )
// Atributos de "soapenv:Envelope"
mxmlElementSetAttr( root, "xmlns:soapenv", "http://schemas.xmlsoap.org/soap/envelope/" )
mxmlElementSetAttr( root, "xmlns:ie2", "https://www3.agenciatributaria.gob.es/static_files/common/internet/dep/aduanas/es/aeat/adia/avit/ws/IeXXXV1Ent.xsd" )
mxmlElementSetAttr( root, "xmlns:cab", "https://www3.agenciatributaria.gob.es/static_files/common/internet/dep/aduanas/es/aeat/adia/avit/ws/cab.xsd" )
header := mxmlNewElement(root, "soapenv:Header")
body := mxmlNewElement(root, "soapenv:Body")
//Declarante
Declarante := mxmlNewElement(body, "ie2:IeXXX")
mxmlElementSetAttr( Declarante, "Id" , dtos(date())+strzero(12345,9) )
mxmlElementSetAttr( Declarante, "NifDeclarante" , "99999999R" )
mxmlElementSetAttr( Declarante, "NombreDeclarante", "JUAN MANOLO MANOLO" )
mxmlSaveFile( xml, cFichSalida, MXML_OPAQUE_CALLBACK )
/*MXML_OPAQUE_CALLBACK constant which specifies that all data nodes in the
document contain opaque string values with whitespace preserved. */
// Parsea el fichero xml para comprobar que cumple con el formato xml.
oXML := mxmlLoadString ( NIL, hb_MemoRead( cFichSalida ), MXML_OPAQUE_CALLBACK )
if empty( oXML )
msgstop("No generó el fichero XML correctamente: "+cFichSalida,"ERROR FICHERO XML")
else
msginfo("Generó fichero: "+cFichSalida,"Proceso terminado")
endif
mxmlDelete( xml )
mxmlDelete( root )
mxmlDelete( header )
mxmlDelete( body )
mxmlDelete( Declarante )
mxmlDelete( oXML )
return nil
Code: Select all
<faultstring>Codigo[1304].El tipo de elemento "soapenv:Envelopexmlns" debe ir seguido por una de estas especificaciones de atributo: ">" o "/>". (1,61)</faultstring>