Cita:
Empezado por razorxxx
Muy buenas!
Estoy tratando de generar desde Delphi un archivo XML de tipo Libro Cobros Emitidas. Utilizando el XML Data Binding generé la unit necesaria desde SuministroLR.xsd
El caso es que en una parte del código me lanza el error EIntfCastError: "interface not supported", pero no veo el fallo. Mi código es el siguiente (los datos fiscales son ficticios):
Código Delphi [-]var
Libro: SuministroLR.IXMLSuministroLRCobrosEmitidas;
Cobro: SuministroLR.IXMLDatosPagoCobroType_sii;
Document: IXMLDocument;
FichEntrada: TextFile;
NumSerieFacturaAnterior: String;
Linea: WideString;
I, J: Integer;
begin
try
Document := TXMLDocument.Create(nil);
Document.ParseOptions := [poResolveExternals, poValidateOnParse];
Document.Options := Document.Options + [doNodeAutoIndent];
Document.NodeIndentStr := ' ';
Document.XML.Text := ' +
'xmlns:sii="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/fact/ws/SuministroInformacion.xsd">';
Document.Active := True;
except
SWERROR := 1;
EXIT;
end;
try
Libro := GetSuministroLRCobrosEmitidas(Document);
Libro.AddChild('sii:Cabecera');
Libro.Cabecera.IDVersionSii := VERSION_SII;
Libro.Cabecera.AddChild('sii:Titular');
Libro.Cabecera.Titular.NombreRazon := 'Prueba'
Libro.Cabecera.Titular.NIF := 'A12345678';
Libro.AddChild('siiLR:RegistroLRCobros');
Libro.RegistroLRCobros[i].AddChild('siiLR:IDFactura');
Libro.RegistroLRCobros[i].IDFactura.AddChild('sii:IDEmisorFactura');
Libro.RegistroLRCobros[i].IDFactura.IDEmisorFactura.NIF := 'A12345678';
Libro.RegistroLRCobros[i].IDFactura.NumSerieFacturaEmisor := '170001';
Libro.RegistroLRCobros[i].IDFactura.FechaExpedicionFacturaEmisor := '20-08-2017';
Libro.RegistroLRCobros[i].AddChild('siiLR:Cobros');
Cobro := Libro.RegistroLRCobros[i].Cobros.Add;
Si muestro el XML mediante ShowMessage(Libro.XML) me va mostrando el árbol correctamente:
Código:
<siiLR:SuministroLRCobrosEmitidas xmlns:siiLR="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/fact/ws/SuministroLR.xsd" xmlns:sii="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/fact/ws/SuministroInformacion.xsd">
<sii:Cabecera>
<sii:IDVersionSii>1.0</sii:IDVersionSii>
<sii:Titular>
<sii:NombreRazon>Prueba</sii:NombreRazon>
<sii:NIF>A12345678</sii:NIF>
</sii:Titular>
</sii:Cabecera>
<siiLR:RegistroLRCobros>
<siiLR:IDFactura>
<sii:IDEmisorFactura>
<sii:NIF>A12345678</sii:NIF>
</sii:IDEmisorFactura>
<sii:NumSerieFacturaEmisor>170001</sii:NumSerieFacturaEmisor>
<sii:FechaExpedicionFacturaEmisor>20-08-2017</sii:FechaExpedicionFacturaEmisor>
</siiLR:IDFactura>
<siiLR:Cobros/>
</siiLR:RegistroLRCobros>
</siiLR:SuministroLRCobrosEmitidas>
¿A alguien se le ocurre dónde puede estar fallando? Gracias de antemano.
|
Me respondo a mi mismo. Al final he conseguido hacer un apaño tratando el nodo como IXMLNode y no como IXMLDatosPagoCobroType_sii. Entonces ya podemos trabajar con las funciones AddChild y ChildNodes. Por ejemplo:
Cobro := Libro.RegistroLRCobros[i].Cobros.AddChild('sii:Cobro');
Cobro.AddChild('sii:Fecha');
Cobro.ChildNodes['Fecha'].NodeValue := '20-08-2017';
Cobro.AddChild('sii:Importe');
Cobro.ChildNodes['Importe'].NodeValue := '1500.00';
Cobro.AddChild('sii:Medio');
Cobro.ChildNodes['Medio'].NodeValue := '01';
No sé si será porque el .xsd está mal definido o qué, pero al menos ya funciona!