Created
November 24, 2016 15:40
-
-
Save goedecke/03e9c7c178ff947b1e9d9eaea4bbe369 to your computer and use it in GitHub Desktop.
Extraer información de CFDI XML facil con simplexml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
$xml = simplexml_load_file('test.xml'); | |
$ns = $xml->getNamespaces(true); | |
$xml->registerXPathNamespace('c', $ns['cfdi']); | |
$xml->registerXPathNamespace('t', $ns['tfd']); | |
//EMPIEZO A LEER LA INFORMACION DEL CFDI E IMPRIMIRLA | |
foreach ($xml->xpath('//cfdi:Comprobante') as $cfdiComprobante){ | |
echo $cfdiComprobante['version']; | |
echo "<br />"; | |
echo $cfdiComprobante['fecha']; | |
echo "<br />"; | |
echo $cfdiComprobante['sello']; | |
echo "<br />"; | |
echo $cfdiComprobante['total']; | |
echo "<br />"; | |
echo $cfdiComprobante['subTotal']; | |
echo "<br />"; | |
echo $cfdiComprobante['certificado']; | |
echo "<br />"; | |
echo $cfdiComprobante['formaDePago']; | |
echo "<br />"; | |
echo $cfdiComprobante['noCertificado']; | |
echo "<br />"; | |
echo $cfdiComprobante['tipoDeComprobante']; | |
echo "<br />"; | |
} | |
foreach ($xml->xpath('//cfdi:Comprobante//cfdi:Emisor') as $Emisor){ | |
echo $Emisor['rfc']; | |
echo "<br />"; | |
echo $Emisor['nombre']; | |
echo "<br />"; | |
} | |
foreach ($xml->xpath('//cfdi:Comprobante//cfdi:Emisor//cfdi:DomicilioFiscal') as $DomicilioFiscal){ | |
echo $DomicilioFiscal['pais']; | |
echo "<br />"; | |
echo $DomicilioFiscal['calle']; | |
echo "<br />"; | |
echo $DomicilioFiscal['estado']; | |
echo "<br />"; | |
echo $DomicilioFiscal['colonia']; | |
echo "<br />"; | |
echo $DomicilioFiscal['municipio']; | |
echo "<br />"; | |
echo $DomicilioFiscal['noExterior']; | |
echo "<br />"; | |
echo $DomicilioFiscal['codigoPostal']; | |
echo "<br />"; | |
} | |
foreach ($xml->xpath('//cfdi:Comprobante//cfdi:Emisor//cfdi:ExpedidoEn') as $ExpedidoEn){ | |
echo $ExpedidoEn['pais']; | |
echo "<br />"; | |
echo $ExpedidoEn['calle']; | |
echo "<br />"; | |
echo $ExpedidoEn['estado']; | |
echo "<br />"; | |
echo $ExpedidoEn['colonia']; | |
echo "<br />"; | |
echo $ExpedidoEn['noExterior']; | |
echo "<br />"; | |
echo $ExpedidoEn['codigoPostal']; | |
echo "<br />"; | |
} | |
foreach ($xml->xpath('//cfdi:Comprobante//cfdi:Receptor') as $Receptor){ | |
echo $Receptor['rfc']; | |
echo "<br />"; | |
echo $Receptor['nombre']; | |
echo "<br />"; | |
} | |
foreach ($xml->xpath('//cfdi:Comprobante//cfdi:Receptor//cfdi:Domicilio') as $ReceptorDomicilio){ | |
echo $ReceptorDomicilio['pais']; | |
echo "<br />"; | |
echo $ReceptorDomicilio['calle']; | |
echo "<br />"; | |
echo $ReceptorDomicilio['estado']; | |
echo "<br />"; | |
echo $ReceptorDomicilio['colonia']; | |
echo "<br />"; | |
echo $ReceptorDomicilio['municipio']; | |
echo "<br />"; | |
echo $ReceptorDomicilio['noExterior']; | |
echo "<br />"; | |
echo $ReceptorDomicilio['noInterior']; | |
echo "<br />"; | |
echo $ReceptorDomicilio['codigoPostal']; | |
echo "<br />"; | |
} | |
foreach ($xml->xpath('//cfdi:Comprobante//cfdi:Conceptos//cfdi:Concepto') as $Concepto){ | |
echo "<br />"; | |
echo $Concepto['unidad']; | |
echo "<br />"; | |
echo $Concepto['importe']; | |
echo "<br />"; | |
echo $Concepto['cantidad']; | |
echo "<br />"; | |
echo $Concepto['descripcion']; | |
echo "<br />"; | |
echo $Concepto['valorUnitario']; | |
echo "<br />"; | |
echo "<br />"; | |
} | |
foreach ($xml->xpath('//cfdi:Comprobante//cfdi:Impuestos//cfdi:Traslados//cfdi:Traslado') as $Traslado){ | |
echo $Traslado['tasa']; | |
echo "<br />"; | |
echo $Traslado['importe']; | |
echo "<br />"; | |
echo $Traslado['impuesto']; | |
echo "<br />"; | |
echo "<br />"; | |
} | |
//ESTA ULTIMA PARTE ES LA QUE GENERABA EL ERROR | |
foreach ($xml->xpath('//t:TimbreFiscalDigital') as $tfd) { | |
echo $tfd['selloCFD']; | |
echo "<br />"; | |
echo $tfd['FechaTimbrado']; | |
echo "<br />"; | |
echo $tfd['UUID']; | |
echo "<br />"; | |
echo $tfd['noCertificadoSAT']; | |
echo "<br />"; | |
echo $tfd['version']; | |
echo "<br />"; | |
echo $tfd['selloSAT']; | |
} | |
?> |
Buenas! alguna actualizacion para que acepte la version 4 o mayor?
Esto me funciono para extraer el UUID del xml con la version 4.0
$uuid = (string) $xml->xpath('//tfd:TimbreFiscalDigital/@uuid')[0];
Entiendo. Prefiero claridad en la implementación (que sea sencillo para el equipo de trabajo), y lo del consumo de memoria pues es relativo, como bien mencionas; depende del tamaño de documentos a leer (¿facturas de 50Mb?) y lo del # de items a extraer, pues.
En fin, fue solo un aporte que muestra que cada quien tiene una visión distinta para lograr sus objetivos. Saludos.
Estoy de acuerdo con esto, implementé tu solución para un detalle específico que tenía accediendo a atributos anidados, te agradezco el aporte.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
foreach ($xml->xpath('//cfdi:Comprobante//cfdi:Impuestos//cfdi:Traslados//cfdi:Traslado') as $traslados) {
$t.= (string)$traslados['TipoFactor'] .'-' .(string)$traslados['TasaOCuota'].(string)$traslados['Importe'].'
';
}
Estoy tratando de leer los traslados dentro de impuestos pero tambien me trae los traslados de los conceptos a pesar de que especifico el xpath...