Por lo pronto, Hacienda acepta el XML aunque ponga <item> en vez de <DetalleDesglose>. También ocurre en el nodo <Destinatarios>. Pero lo dicho, se lo traga como si estuviera bien.
En nuestro caso, nosotros guardamos el RF en la BD, porque luego otra aplicación se encarga de hacer los envíos a Hacienda desde el Servidor, así que hay que "leer" ese XML y volver a convertirlo en objeto, para poder firmarlo y enviarlo.
Nosotros hemos optado por modificar el texto a mano, por si acaso algún día se pongan tiquismiquis con los nombres de esos nodos y deje de funcionar.
Concretamente hacemos esto:
Código:
// Reemplazamos el nodo raíz con el generado
MyXML.DocumentElement := NewNode;
MyXML.XML.Text := stringreplace(MyXML.XML.Text,'<Desglose><item>','<Desglose><DetalleDesglose>',[rfReplaceAll]);
MyXML.XML.Text := stringreplace(MyXML.XML.Text,'</item></Desglose>','</DetalleDesglose></Desglose>',[rfReplaceAll]);
MyXML.XML.Text := stringreplace(MyXML.XML.Text,'<Destinatarios><item>','<Destinatarios><IDDestinatario>',[rfReplaceAll]);
MyXML.XML.Text := stringreplace(MyXML.XML.Text,'</IDDestinatario></item>','</IDDestinatario></Destinatarios>',[rfReplaceAll]);
MyXML.XML.Text := FormatXMLData(MyXML.XML.Text);
MyXML.XML.SaveToFile(extractfilepath(application.exename)+'VeriFactu/RF'+RegistroFactura.RegistroAlta.RefExterna+'.xml',TEncoding.UTF8); // Provisional
Hay que hacerlo ANTES de lalamr a FormatXMLData(), porque una vez formateado el XML, cada nodo tendrá su propia línea en el archivo y es más difícil encontrar los nodos chungos.
O eso, o usar la función ReemplazarItemEnSeccion() que has facilitado, que es más genérica y servirá para cualquier otra incidencia que pueda surgir.
Nosotros guardamos el XML/RF de cada factura en disco, pero solo por tener más seguridad y que en caso de algún error poder revisarlo todo más cómoda y rápidamente. En realidad el RF se guarda en la BD también, así que los archivos "sobran", pero es más rápido buscar/abrir un archivo en el disco que hacerlo en la BD.