Al acabar te generará un fichero que te añado en los adjuntos con los interfaces necesarios para trabajar (leer y escribir) un XML como el que has puesto:
Código Delphi
[-]
unit DatosComprobante;
interface
uses Xml.xmldom, Xml.XMLDoc, Xml.XMLIntf;
type
IXMLComprobante = interface;
IXMLComprobante_InformacionGlobal = interface;
IXMLComprobante_CfdiRelacionados = interface;
IXMLComprobante_CfdiRelacionadosList = interface;
IXMLComprobante_CfdiRelacionados_CfdiRelacionado = interface;
IXMLComprobante_Emisor = interface;
IXMLComprobante_Receptor = interface;
IXMLComprobante_Conceptos = interface;
IXMLComprobante_Conceptos_Concepto = interface;
IXMLComprobante_Conceptos_Concepto_Impuestos = interface;
IXMLComprobante_Conceptos_Concepto_Impuestos_Traslados = interface;
IXMLComprobante_Conceptos_Concepto_Impuestos_Traslados_Traslado = interface;
IXMLComprobante_Conceptos_Concepto_Impuestos_Retenciones = interface;
IXMLComprobante_Conceptos_Concepto_Impuestos_Retenciones_Retencion = interface;
IXMLComprobante_Conceptos_Concepto_ACuentaTerceros = interface;
IXMLComprobante_Conceptos_Concepto_InformacionAduanera = interface;
IXMLComprobante_Conceptos_Concepto_InformacionAduaneraList = interface;
IXMLComprobante_Conceptos_Concepto_CuentaPredial = interface;
IXMLComprobante_Conceptos_Concepto_CuentaPredialList = interface;
IXMLComprobante_Conceptos_Concepto_ComplementoConcepto = interface;
IXMLComprobante_Conceptos_Concepto_Parte = interface;
IXMLComprobante_Conceptos_Concepto_ParteList = interface;
IXMLComprobante_Conceptos_Concepto_Parte_InformacionAduanera = interface;
IXMLComprobante_Impuestos = interface;
IXMLComprobante_Impuestos_Retenciones = interface;
IXMLComprobante_Impuestos_Retenciones_Retencion = interface;
IXMLComprobante_Impuestos_Traslados = interface;
IXMLComprobante_Impuestos_Traslados_Traslado = interface;
IXMLComprobante_Complemento = interface;
IXMLComprobante_Addenda = interface;
IXMLComprobante = interface(IXMLNode)
['{1B030F71-3BDF-403F-879E-FEEFF468D142}']
...
...
Una vez que tengas ese fichero en tu proyecto, las líneas para leer los datos que necesitas son triviales.
Un código como este:
Código Delphi
[-]
...
uses
DatosComprobante;
procedure _Log(msg:string);
begin
Form3.mmDatos.Lines.Add(msg);
end;
procedure TForm3.Button1Click(Sender: TObject);
var
comp:IXMLComprobante;
concepto:IXMLComprobante_Conceptos_Concepto;
idx:integer;
begin
comp := LoadComprobante('c:\ProyectosDelphi\Ej Parse XML\Datos.xml');
_Log('Version: ' + comp.Version);
_Log('Serie: ' + comp.Serie);
_Log('Folio: ' + comp.Folio);
_Log('...');
_Log('Emisor:');
_Log(' RFC: ' + comp.Emisor.Rfc);
_Log(' Nombre: ' + comp.Emisor.Nombre);
_Log(' ... ');
_Log('Receptor: ' + comp.Receptor.Rfc);
_Log(' RFC: ' + comp.Receptor.Rfc);
_Log(' Nombre: ' + comp.Receptor.Nombre);
_Log(' ... ');
_Log('Conceptos: ');
for idx := 0 to comp.Conceptos.Count - 1 do begin
concepto := comp.Conceptos[idx];
_Log(' Conceptos; Indice=' + idx.ToString);
_Log(' ClaveProdServ:' + concepto.ClaveProdServ);
_Log(' NoIdentificacion:' + concepto.NoIdentificacion);
_Log(' Cantidad:' + concepto.Cantidad.ToString);
_Log(' ClaveUnidad:' + concepto.ClaveUnidad);
_Log(' ...');
end;
_Log('...');
end;
Te genera un resultado como el que se ve a continuación:
