Foros del Web » Programando para Internet » PHP »

Importacion xml a mysql

Estas en el tema de Importacion xml a mysql en el foro de PHP en Foros del Web. Buenas a ver si alguno de vosotros me saca del atolladero en el que estoy. tengo el siguiente fichero xml Código: <?xml version="1.0" encoding="UTF-8"?> <!-- ...
  #1 (permalink)  
Antiguo 10/07/2018, 14:04
 
Fecha de Ingreso: junio-2007
Mensajes: 77
Antigüedad: 11 años, 3 meses
Puntos: 1
Importacion xml a mysql

Buenas

a ver si alguno de vosotros me saca del atolladero en el que estoy.

tengo el siguiente fichero xml
Código:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated by Oracle Reports version 11.1.2.2.0 -->
<REPARTOS_R_SB>
  <LIST_G_REPARTO>
    <G_REPARTO>
      <CRC_EMPRESA>1</CRC_EMPRESA>
      <CRC_NUMERO_REPARTO>42916</CRC_NUMERO_REPARTO>
      <CRC_CENTRO>DM01</CRC_CENTRO>
      <ESTADO>ABIERTO</ESTADO>
      <CRC_AGENCIA_TRANSPORTE>999</CRC_AGENCIA_TRANSPORTE>
      <CRC_FECHA_REPARTO>04/07/18</CRC_FECHA_REPARTO>
      <AGENCIA_TRANSPORTE>999 - SERVIRUTA</AGENCIA_TRANSPORTE>
      <CENTRO>DM01 - NOMBRE DEL CENTRO</CENTRO>
      <LIST_G_ALBARANES>
        <G_ALBARANES>
          <CRD_NOALB_D_POSTAL></CRD_NOALB_D_POSTAL>
          <CRD_NOALB_NOMBRE></CRD_NOALB_NOMBRE>
          <CRD_NOALB_DIRECCION></CRD_NOALB_DIRECCION>
          <CRD_NOALB_POBLACION></CRD_NOALB_POBLACION>
          <CRD_NOALB_PROVINCIA></CRD_NOALB_PROVINCIA>
          <CRD_NOALB_TELEFONO></CRD_NOALB_TELEFONO>
          <MODALIDAD>ENTREGA</MODALIDAD>
          <CRD_TIPO_REPARTO>A</CRD_TIPO_REPARTO>
          <CRD_OBSERVACIONES></CRD_OBSERVACIONES>
          <CRD_BULTOS>1</CRD_BULTOS>
          <CRD_MOTIVO_FALLO></CRD_MOTIVO_FALLO>
          <CRD_CLIENTE_PROVEEDOR>70227080</CRD_CLIENTE_PROVEEDOR>
          <CRD_DOCUMENTO>70157296</CRD_DOCUMENTO>
          <CRD_EMPRESA>1</CRD_EMPRESA>
          <CRD_NUMERO_REPARTO>42916</CRD_NUMERO_REPARTO>
          <CRD_ORDEN_REPARTO>5</CRD_ORDEN_REPARTO>
          <CRD_EJERCICIO>2018</CRD_EJERCICIO>
          <CRD_ESTADO>en Curso</CRD_ESTADO>
          <CP_NOMBRE>cliente1</CP_NOMBRE>
          <CP_NOMBRE_OBRA>CLIENTE 1</CP_NOMBRE_OBRA>
          <CP_DIRECCION>DIRECCION 1</CP_DIRECCION>
          <CP_POBLACION>45517 - ESCALONILLA</CP_POBLACION>
          <CP_PROVINCIA>TOLEDO</CP_PROVINCIA>
          <CP_TELEFONO>Telf. 666666666</CP_TELEFONO>
          <CP_FECHA_DOCUMENTO>04/07/18</CP_FECHA_DOCUMENTO>
          <CP_IMPORTE_ALBARAN>1965,6</CP_IMPORTE_ALBARAN>
          <CF_DATOS_POR_DOCUMENTO>0</CF_DATOS_POR_DOCUMENTO>
          <CP_PKLIST></CP_PKLIST>
          <CP_CENTRO>DM02 - CENTRO1</CP_CENTRO>
        </G_ALBARANES>
        <G_ALBARANES>
          <CRD_NOALB_D_POSTAL></CRD_NOALB_D_POSTAL>
          <CRD_NOALB_NOMBRE></CRD_NOALB_NOMBRE>
          <CRD_NOALB_DIRECCION></CRD_NOALB_DIRECCION>
          <CRD_NOALB_POBLACION></CRD_NOALB_POBLACION>
          <CRD_NOALB_PROVINCIA></CRD_NOALB_PROVINCIA>
          <CRD_NOALB_TELEFONO></CRD_NOALB_TELEFONO>
          <MODALIDAD>ENTREGA</MODALIDAD>
          <CRD_TIPO_REPARTO>A</CRD_TIPO_REPARTO>
          <CRD_OBSERVACIONES></CRD_OBSERVACIONES>
          <CRD_BULTOS>6</CRD_BULTOS>
          <CRD_MOTIVO_FALLO></CRD_MOTIVO_FALLO>
          <CRD_CLIENTE_PROVEEDOR>70200059</CRD_CLIENTE_PROVEEDOR>
          <CRD_DOCUMENTO>70157271</CRD_DOCUMENTO>
          <CRD_EMPRESA>1</CRD_EMPRESA>
          <CRD_NUMERO_REPARTO>42916</CRD_NUMERO_REPARTO>
          <CRD_ORDEN_REPARTO>10</CRD_ORDEN_REPARTO>
          <CRD_EJERCICIO>2018</CRD_EJERCICIO>
          <CRD_ESTADO>en Curso</CRD_ESTADO>
          <CP_NOMBRE>CLIENTE 2</CP_NOMBRE>
          <CP_NOMBRE_OBRA>CLIENTE 2</CP_NOMBRE_OBRA>
          <CP_DIRECCION>DIRECCION 2</CP_DIRECCION>
          <CP_POBLACION>45500 - TORRIJOS</CP_POBLACION>
          <CP_PROVINCIA>TOLEDO</CP_PROVINCIA>
          <CP_TELEFONO>Telf. 666666666</CP_TELEFONO>
          <CP_FECHA_DOCUMENTO>04/07/18</CP_FECHA_DOCUMENTO>
          <CP_IMPORTE_ALBARAN>210,49</CP_IMPORTE_ALBARAN>
          <CF_DATOS_POR_DOCUMENTO>0</CF_DATOS_POR_DOCUMENTO>
          <CP_PKLIST></CP_PKLIST>
          <CP_CENTRO>DM02 - CENTRO2</CP_CENTRO>
        </G_ALBARANES>
        <G_ALBARANES>
          <CRD_NOALB_D_POSTAL></CRD_NOALB_D_POSTAL>
          <CRD_NOALB_NOMBRE></CRD_NOALB_NOMBRE>
          <CRD_NOALB_DIRECCION></CRD_NOALB_DIRECCION>
          <CRD_NOALB_POBLACION></CRD_NOALB_POBLACION>
          <CRD_NOALB_PROVINCIA></CRD_NOALB_PROVINCIA>
          <CRD_NOALB_TELEFONO></CRD_NOALB_TELEFONO>
          <MODALIDAD>ENTREGA</MODALIDAD>
          <CRD_TIPO_REPARTO>A</CRD_TIPO_REPARTO>
          <CRD_OBSERVACIONES>S/Ref:T/210</CRD_OBSERVACIONES>
          <CRD_BULTOS>1</CRD_BULTOS>
          <CRD_MOTIVO_FALLO></CRD_MOTIVO_FALLO>
          <CRD_CLIENTE_PROVEEDOR>70200754</CRD_CLIENTE_PROVEEDOR>
          <CRD_DOCUMENTO>70157268</CRD_DOCUMENTO>
          <CRD_EMPRESA>1</CRD_EMPRESA>
          <CRD_NUMERO_REPARTO>42916</CRD_NUMERO_REPARTO>
          <CRD_ORDEN_REPARTO>15</CRD_ORDEN_REPARTO>
          <CRD_EJERCICIO>2018</CRD_EJERCICIO>
          <CRD_ESTADO>en Curso</CRD_ESTADO>
          <CP_NOMBRE>CLIENTE 3</CP_NOMBRE>
          <CP_NOMBRE_OBRA>CLIENTE 3</CP_NOMBRE_OBRA>
          <CP_DIRECCION>DIRECCION 3</CP_DIRECCION>
          <CP_POBLACION>45500  - TORRIJOS</CP_POBLACION>
          <CP_PROVINCIA>TOLEDO</CP_PROVINCIA>
          <CP_TELEFONO>Telf. 666666666</CP_TELEFONO>
          <CP_FECHA_DOCUMENTO>04/07/18</CP_FECHA_DOCUMENTO>
          <CP_IMPORTE_ALBARAN>22,71</CP_IMPORTE_ALBARAN>
          <CF_DATOS_POR_DOCUMENTO>0</CF_DATOS_POR_DOCUMENTO>
          <CP_PKLIST></CP_PKLIST>
          <CP_CENTRO>DM02 - CENTRO 3</CP_CENTRO>
        </G_ALBARANES>
        <G_ALBARANES>
          <CRD_NOALB_D_POSTAL></CRD_NOALB_D_POSTAL>
          <CRD_NOALB_NOMBRE></CRD_NOALB_NOMBRE>
          <CRD_NOALB_DIRECCION></CRD_NOALB_DIRECCION>
          <CRD_NOALB_POBLACION></CRD_NOALB_POBLACION>
          <CRD_NOALB_PROVINCIA></CRD_NOALB_PROVINCIA>
          <CRD_NOALB_TELEFONO></CRD_NOALB_TELEFONO>
          <MODALIDAD>ENTREGA</MODALIDAD>
          <CRD_TIPO_REPARTO>A</CRD_TIPO_REPARTO>
          <CRD_OBSERVACIONES>S/Ref:718183</CRD_OBSERVACIONES>
          <CRD_BULTOS>1</CRD_BULTOS>
          <CRD_MOTIVO_FALLO></CRD_MOTIVO_FALLO>
          <CRD_CLIENTE_PROVEEDOR>70300240</CRD_CLIENTE_PROVEEDOR>
          <CRD_DOCUMENTO>70157265</CRD_DOCUMENTO>
          <CRD_EMPRESA>1</CRD_EMPRESA>
          <CRD_NUMERO_REPARTO>42916</CRD_NUMERO_REPARTO>
          <CRD_ORDEN_REPARTO>20</CRD_ORDEN_REPARTO>
          <CRD_EJERCICIO>2018</CRD_EJERCICIO>
          <CRD_ESTADO>en Curso</CRD_ESTADO>
          <CP_NOMBRE>CLIENTE 4</CP_NOMBRE>
          <CP_NOMBRE_OBRA>718183</CP_NOMBRE_OBRA>
          <CP_DIRECCION>DIRECCION 4</CP_DIRECCION>
          <CP_POBLACION>CLIENTE 4</CP_POBLACION>
          <CP_PROVINCIA>MADRID</CP_PROVINCIA>
          <CP_TELEFONO>Telf. 666666666</CP_TELEFONO>
          <CP_FECHA_DOCUMENTO>04/07/18</CP_FECHA_DOCUMENTO>
          <CP_IMPORTE_ALBARAN>56,27</CP_IMPORTE_ALBARAN>
          <CF_DATOS_POR_DOCUMENTO>0</CF_DATOS_POR_DOCUMENTO>
          <CP_PKLIST></CP_PKLIST>
          <CP_CENTRO>DM03 - CENTRO 4</CP_CENTRO>
        </G_ALBARANES>
      </LIST_G_ALBARANES>
      <CS_TOT_DOC>39</CS_TOT_DOC>
      <CF_TOT_DIR>23</CF_TOT_DIR>
      <CS_TOT_BULTOS>53</CS_TOT_BULTOS>
      <CS_TOT_IMPORTE>10742,56</CS_TOT_IMPORTE>
    </G_REPARTO>
  </LIST_G_REPARTO>
  <PIE> Informe generado por AMIGUELANEZ el 06/07/18 09:09:28</PIE>
</REPARTOS_R_SB>
y lo importo mediante el siguiente codigo
Código PHP:
<?php
//import.php
//sleep(3);
$output '';

if(isset(
$_FILES['file']['name']) &&  $_FILES['file']['name'] != '')
{
 
$valid_extension = array('xml');
 
$file_data explode('.'$_FILES['file']['name']);
 
$file_extension end($file_data);
 if(
in_array($file_extension$valid_extension))
 {
  
$data simplexml_load_file($_FILES['file']['tmp_name']);
  
$connect = new PDO('mysql:host=localhost;dbname=testing','root''');
  
$query "
  INSERT INTO envio 
         (expedi, codigo, consigna, domicilio, provin, bultos, tipo, observ, telefono, enviado, fecha1) 
  VALUES(:expedi,:codigo,:consigna,:domicilio,:provin,:bultos,:tipo,:observ,:telefono,:enviado, curdate());
  "
;
  
$statement $connect->prepare($query);
  for(
$i 0$i count($data); $i++)
  {
   
$statement->execute(
    array(
     
':expedi'   => substr($data->LIST_G_REPARTO->G_REPARTO->LIST_G_ALBARANES->G_ALBARANES[$i]->CRD_DOCUMENTO,2),
     
':codigo'   => "122",
     
':consigna' => $data->LIST_G_REPARTO->G_REPARTO->LIST_G_ALBARANES->G_ALBARANES[$i]->CP_NOMBRE_OBRA,
     
':domicilio'=> $data->LIST_G_REPARTO->G_REPARTO->LIST_G_ALBARANES->G_ALBARANES[$i]->CP_DIRECCION,
     
':provin'   => $data->LIST_G_REPARTO->G_REPARTO->LIST_G_ALBARANES->G_ALBARANES[$i]->CP_PROVINCIA,
     
':bultos'   => $data->LIST_G_REPARTO->G_REPARTO->LIST_G_ALBARANES->G_ALBARANES[$i]->CRD_BULTOS,
     
':tipo'     => "P",
     
':observ'   => $data->LIST_G_REPARTO->G_REPARTO->LIST_G_ALBARANES->G_ALBARANES[$i]->CRD_OBSERVACIONES,
     
':telefono' => substr($data->LIST_G_REPARTO->G_REPARTO->LIST_G_ALBARANES->G_ALBARANES[$i]->CP_TELEFONO,6),
     
':enviado'  => "N"
    
)
   );

  }
  
$result $statement->fetchAll();
  if(isset(
$result))
  {
   
$output '<div class="alert alert-success">Import Data Done</div>';
  }
 }
 else
 {
  
$output '<div class="alert alert-warning">Invalid File</div>';
 }
}
else
{
 
$output '<div class="alert alert-warning">Please Select XML File</div>';
}

echo 
$output;

?>
y mo problema radica en que sólo me importa dos registros, cliente 1 y cliente 2

Si hago un debugger con netbeans me da que el valor de $data el 2, y no soy capaz de hacer que recorra todo el fichero.

Sin embargo si quito nodos, y dejo el xml solo con las etiquetas <list_g_albaranes> y <g_albaranes> si me recorre todo el fichero.
Sabeis que puede ser?

Un saludo
  #2 (permalink)  
Antiguo 10/07/2018, 18:44
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 9.869
Antigüedad: 10 años, 1 mes
Puntos: 2150
Respuesta: Importacion xml a mysql

Probablemente hay un error en el XML, quizá algún dato vacío o nulo.

Convendría que muestres en pantalla la información antes de realizar la inserción.
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 11/07/2018, 04:39
 
Fecha de Ingreso: junio-2007
Mensajes: 77
Antigüedad: 11 años, 3 meses
Puntos: 1
Respuesta: Importacion xml a mysql

Ufff

He probado de todo, y ya no se que hacer, he puesto algun punto de informacion para que me vaya indicando, y si $data = simplexml_load_file($_FILES['file']['tmp_name']); , cuando hago un count($data) siempre me da 2, que son los registros que me toma, no creo que el fallo este en el xml, ya que lo he reducio a la mnima expresion, y nada, sigue igual, siempre que mantenga todos los nodos, sin embargo si reduzco los nodos, y los dejo como he indicado anteriormente en 2, entonces me coge todos los datos del xml.

Saludos
  #4 (permalink)  
Antiguo 11/07/2018, 13:47
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.302
Antigüedad: 10 años, 9 meses
Puntos: 2646
Respuesta: Importacion xml a mysql

Hace mucho que no hago algo de este tema, pero si no me equivoco el problema es que tienes una tabla dentro de otra tabla.
Tienes que separar el cliente de la lista de albaranes. Es decir, por cada cliente, recorres los albaranes. Para mi la cosa es que el modelado de datos no es correcto...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)



La zona horaria es GMT -6. Ahora son las 04:25.