Ver Mensaje Individual
  #1 (permalink)  
Antiguo 22/02/2012, 02:11
rudy_perrod
 
Fecha de Ingreso: diciembre-2008
Mensajes: 3
Antigüedad: 16 años
Puntos: 2
Problemas al leer XML con SIMPLEXML

Hola buen dia
estoy trabajando en como leer el contenido de un XML en PHP con simplexml, concretamente con la funcion simplexml_load_string().
Toda la informacion es leida corerctamente, solo que al acceder al ultimo nodo (o namespace) y sus nodos anidados me regresa este error

Warning: SimpleXMLElement::xpath() [simplexmlelement.xpath]: Undefined namespace prefix in C:\xampp\htdocs\factura_electronica\XML.php on line 110

Warning: SimpleXMLElement::xpath() [simplexmlelement.xpath]: xmlXPathEval: evaluation failed in C:\xampp\htdocs\factura_electronica\XML.php on line 110

El codigo que utilizo es el siguiente:

Código PHP:
<?
$link 
mysql_connect("localhost""root""");
mysql_select_db("prueba");
$sql "SELECT archivo FROM archivos WHERE id=1"//EL XML ESTA GUARDADO EN UN CAMPO LONGBLOB LLAMADO archivo
$res mysql_query($sql$link);
$row mysql_fetch_array($res);
$xml simplexml_load_string($row["archivo"]);
//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 />";
}
//HASTA AQUI TODA LA INFORMACION ES LEIDA E IMPRESA CORRECTAMENTE
//ESTA ULTIMA PARTE ES LA QUE GENERA ERROR, AL PARECER NO ENCUENTRA EL NODO
foreach ($xml->xpath('//cfdi:Comprobante//cfdi:Complemento//tfd:TimbreFiscalDigital') as $TimbreFiscalDigital){
   echo 
$TimbreFiscalDigital['selloCFD'];
   echo 
"<br />";
   echo 
$TimbreFiscalDigital['FechaTimbrado'];
   echo 
"<br />";
   echo 
$TimbreFiscalDigital['UUID'];
   echo 
"<br />";
   echo 
$TimbreFiscalDigital['noCertificadoSAT'];
   echo 
"<br />";
   echo 
$TimbreFiscalDigital['version'];
   echo 
"<br />";
   echo 
$TimbreFiscalDigital['selloSAT'];
   echo 
"<br />";
}
?>
Ya cheque la documentacion de PHP sobre simplexml pero no logro encontrar la forma de acceder a este ultimo nodo del XML, espero alguien ya haya trabajado esta funcion para una aplicacion similar y me diga que estoy implementando mal.
El contenido del arcihvo XML es el siguiente
Código XML:
Ver original
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <cfdi:Comprobante xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 cfdv3.xsd" xmlns:cfdi="http://www.sat.gob.mx/cfd/3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.0" fecha="2010-03-06T20:38:12" sello="tOSe+Ex/wvn33YlGwtfmrJwQ31Crd7lI9VcH63TGjHfxk5vfb3q9uSbDUGk9TXvo70ydOpikRVw+9B2Six0mbu3PjoPpO909oAYITrRyomdeUGJ4vmA2/12L86EJLWpU7vIt4cL8HpkEw7TOFhSdpzb/890+jP+C1adBsHU1VHc=" total="488.50" subTotal="488.50" certificado="MIIE/TCCA+WgAwIBAgIUMzAwMDEwMDAwMDAxMDAwMDA4MDAwDQYJKoZIhvcNAQEFBQAwggFvMRgwFgYDVQQDDA9BLkMuIGRlIHBydWViYXMxLzAtBgNVBAoMJlNlcnZpY2lvIGRlIEFkbWluaXN0cmFjacOzbiBUcmlidXRhcmlhMTgwNgYDVQQLDC9BZG1pbmlzdHJhY2nDs24gZGUgU2VndXJpZGFkIGRlIGxhIEluZm9ybWFjacOzbjEpMCcGCSqGSIb3DQEJARYaYXNpc25ldEBwcnVlYmFzLnNhdC5nb2IubXgxJjAkBgNVBAkMHUF2LiBIaWRhbGdvIDc3LCBDb2wuIEd1ZXJyZXJvMQ4wDAYDVQQRDAUwNjMwMDELMAkGA1UEBhMCTVgxGTAXBgNVBAgMEERpc3RyaXRvIEZlZGVyYWwxEjAQBgNVBAcMCUNveW9hY8OhbjEVMBMGA1UELRMMU0FUOTcwNzAxTk4zMTIwMAYJKoZIhvcNAQkCDCNSZXNwb25zYWJsZTogSMOpY3RvciBPcm5lbGFzIEFyY2lnYTAeFw0xMDA3MzAxNjU4NDBaFw0xMjA3MjkxNjU4NDBaMIGWMRIwEAYDVQQDDAlNYXRyaXogU0ExEjAQBgNVBCkMCU1hdHJpeiBTQTESMBAGA1UECgwJTWF0cml6IFNBMSUwIwYDVQQtExxBQUEwMTAxMDFBQUEgLyBBQUFBMDEwMTAxQUFBMR4wHAYDVQQFExUgLyBBQUFBMDEwMTAxSERGUlhYMDExETAPBgNVBAsMCFVuaWRhZCAxMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDD0ltQNthUNUfzq0t1GpIyapjzOn1W5fGM5G/pQyMluCzP9YlVAgBjGgzwYp9Z0J9gadg3y2ZrYDwvv8b72goyRnhnv3bkjVRKlus6LDc00K7Jl23UYzNGlXn5+i0HxxuWonc2GYKFGsN4rFWKVy3Fnpv8Z2D7dNqsVyT5HapEqwIDAQABo4HqMIHnMAwGA1UdEwEB/wQCMAAwCwYDVR0PBAQDAgbAMB0GA1UdDgQWBBSYodSwRczzj5H7mcO3+mAyXz+y0DAuBgNVHR8EJzAlMCOgIaAfhh1odHRwOi8vcGtpLnNhdC5nb2IubXgvc2F0LmNybDAzBggrBgEFBQcBAQQnMCUwIwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLnNhdC5nb2IubXgvMB8GA1UdIwQYMBaAFOtZfQQimlONnnEaoFiWKfU54KDFMBAGA1UdIAQJMAcwBQYDKgMEMBMGA1UdJQQMMAoGCCsGAQUFBwMCMA0GCSqGSIb3DQEBBQUAA4IBAQArHQEorApwqumSn5EqDOAjbezi8fLco1cYES/PD+LQRM1Vb1g7VLE3hR4S5NNBv0bMwwWAr0WfL9lRRj0PMKLorO8y4TJjRU8MiYXfzSuKYL5Z16kW8zlVHw7CtmjhfjoIMwjQo3prifWxFv7VpfIBstKKShU0qB6KzUUNwg2Ola4t4gg2JJcBmyIAIInHSGoeinR2V1tQ10aRqJdXkGin4WZ75yMbQH4L0NfotqY6bpF2CqIY3aogQyJGhUJji4gYnS2DvHcyoICwgawshjSaX8Y0Xlwnuh6EusqhqlhTgwPNAPrKIXCmOWtqjlDhho/lhkHJMzuTn8AoVapbBUn" formaDePago="PAGO EN UNA SOLA EXHIBICION" noCertificado="30001000000100000800" tipoDeComprobante="ingreso">
  3.     <cfdi:Emisor rfc="PPL961114GZ1" nombre="PHARMA PLUS SA DE CV">
  4.         <cfdi:DomicilioFiscal pais="Mexico" calle="AV. RIO MIXCOAC" estado="MEXICO, D.F." colonia="ACACIAS" municipio="BENITO JUAREZ" noExterior="No. 140" codigoPostal="03240"/>
  5.         <cfdi:ExpedidoEn pais="Mexico" calle="AV. UNIVERSIDAD" estado="DISTRITO FEDERAL" colonia="OXTOPULCO" noExterior="1858" codigoPostal="03910"/>
  6.     </cfdi:Emisor>
  7.     <cfdi:Receptor rfc="PEPJ8001019Q8" nombre="JUAN PEREZ PEREZ">
  8.         <cfdi:Domicilio pais="Mexico" calle="AV UNIVERSIDAD" estado="DISTRITO FEDERAL" colonia="COPILCO UNIVERSIDAD" municipio="COYOACAN" noExterior="16 EDF 3" noInterior="DPTO 101" codigoPostal="04360"/>
  9.     </cfdi:Receptor>
  10.     <cfdi:Conceptos>
  11.         <cfdi:Concepto unidad="CAPSULAS" importe="244.00" cantidad="1.0" descripcion="VIBRAMICINA 100MG 10" valorUnitario="244.00"/>
  12.         <cfdi:Concepto unidad="BOTELLA" importe="137.93" cantidad="1.0" descripcion="CLORUTO 500M" valorUnitario="137.93"/>
  13.         <cfdi:Concepto unidad="TABLETAS" importe="84.50" cantidad="1.0" descripcion="SEDEPRON 250MG 10" valorUnitario="84.50"/>
  14.     </cfdi:Conceptos>
  15.     <cfdi:Impuestos>
  16.         <cfdi:Traslados>
  17.             <cfdi:Traslado tasa="0.00" importe="0.00" impuesto="IVA"/>
  18.             <cfdi:Traslado tasa="16.00" importe="22.07" impuesto="IVA"/>
  19.         </cfdi:Traslados>
  20.     </cfdi:Impuestos>
  21.     <cfdi:Complemento>
  22.         <tfd:TimbreFiscalDigital xmlns:tfd="http://www.sat.gob.mx/TimbreFiscalDigital" xsi:schemaLocation="http://www.sat.gob.mx/TimbreFiscalDigital TimbreFiscalDigital.xsd" selloCFD="tOSe+Ex/wvn33YlGwtfmrJwQ31Crd7lI9VcH63TGjHfxk5vfb3q9uSbDUGk9TXvo70ydOpikRVw+9B2Six0mbu3PjoPpO909oAYITrRyomdeUGJ4vmA2/12L86EJLWpU7vIt4cL8HpkEw7TOFhSdpzb/890+jP+C1adBsHU1VHc=" FechaTimbrado="2010-03-06T20:40:10" UUID="ad662d33-6934-459c-a128-bdf0393e0f44" noCertificadoSAT="30001000000100000801" version="1.0" selloSAT="j5bSpqM3w0+shGtImqOwqqy6+d659O78ckfstu5vTSFa+2CVMj6Awfr18x4yMLGBwk6ruYbjBlVURodEIl6nJIhTTUtYQV1cbRDG9kvvhaNAakxqaSOnOx79nHxqFPRVoqh10CsjocS9PZkSM2jz1uwLgaF0knf1g8pjDkLYwlk="/>
  23.     </cfdi:Complemento>
  24.     <cfdi:Addenda/>
  25. </cfdi:Comprobante>