Importaciopn xml a una base de datos mdb mediante PHP

Ya he conseguido meter los datos de un fichero xml a una base de datos mdb(me faltaba la conexión odbc), ahora necesito una cosa:
Pongamos que el xml esta en una carpeta, y tengo que exportar tdos los datos del fichero hacia la base de datos, la pregunta es, si la carpeta tiene más un xml, como puedo hacer para canseguir que me detecte que hay más de un xml en la carpeta, y que me exporte los datos de cada uno, ¿uno tras otro?
Finalidad que me lea todos los xml que la carpeta y que los exporte a la base de datos uno tras otro.

2 Respuestas

Respuesta
1
Lo que puedes hacer es leer el directorio y cargar 1 por uno los xml en la base de datos.
Para ello se usa la función: opendir($ruta) y readdir($directorio).
Un ejemplo simple:
$ruta="/var/www/xmls";
$directorio=opendir($ruta);
while($file=readdir($directorio)){ //Mientras hayan ficheros en el directorio
//$en $file esta el nombre del archivo
//pon aqui la carga del xml a la bd
}
closedir($directorio);
Cosas a tener en cuenta:
php (apache) debe tener permisos de lectura en ese directorio (si no devuelve false el opendir con un E_WARNING).
Readdir lee todos los archivos que hay en el directorio (en linux . y .. también salen)
Puedes combinar esto con is_dir($file) que devuelve true si es directorio y con is_file($file) (lo mismo para archivos.)
Si tienes más cosas aparte de xmls puedes ponerle un filtro para que te detecte solo los .xml:
if(substr($file,-4,4)==".xml") { //los 4 ultimos caracteres son ".xml"
//importar a la bd
}
Mira:
<?php
// Variable con el nombre del fichero a importar
$xml_file = 'WEB_ART.XML';
if (file_exists($xml_file)) {
    $xml = simplexml_load_file($xml_file);
} else {
    exit('Error al intentar abrir el fichero '.$xml_file);
}
// Todo bien asi que abrimos BD para importar
require 'config.php';    
/* Recorremos el XML */
if (!$odbc) {
die('NO hai conexion con la tabla odbc');
}
echo "Con exito";
$ruta="D:\Documents and Settings\LUCAS\Escritorio\xml\root\xml\prueba";
$directorio=opendir($ruta);
while($file=readdir($directorio)){ $count=0;
foreach ($xml->ART as $XML_ART) {  
    // Inserta el libro en la tabla
   $qry = "INSERT INTO TABLA".
      "(nombre, descripcion, tipo1, tipo2, cifra1)".
      " VALUES ('$XML_ART->IDART', ".
      "'$XML_ART->NOMART', ".
      "'$XML_ART->FAMART', ".
      "'$XML_ART->SFMART', ".
      $XML_ART->PRECIO.")";
   // Ahora ejecutamos el INSERT en la BD         
  // $result = mysql_query($qry) or die(mysql_error());
// $result= odbc_exec($odbc,$qry);
$prepare = odbc_prepare($odbc,$qry);
$execute = odbc_execute($prepare,array(""));
}
closedir($directorio);
// echo "$qry";
   // Incrementamos contado para ver cuantos libros se importan.
   $count++;
}
odbc_close($odbc);
echo "<br/>";
echo "-------------------------------------------<br/>";
echo "Total de libros importados: $count properties<br/>";
echo "-------------------------------------------<br/>";
?>
¿Qué he hecho mal?
Muchas gracias de verdad por tu rapidez, no te imaginas cuanto te lo agradezco, xd
El problema creo que está en
$ruta="D:\Documents and Settings\LUCAS\Escritorio\xml\root\xml\prueba";
php usa \ para escapar caracteres prueba a poner una doble \
$ruta="D:\\Documents and Settings\\LUCASv\Escritorio\\xml\\root\\xml\\prueba";
Si te sigue dando error pégame el error que te de php y prueba a poner los xml dentro de la carpeta del apache (donde tienes localhost)
Me pone ese error:
Parse error: syntax error, unexpected T_STRING in D:\Documents and Settings\LUCAS\Escritorio\xml\root\xml\prueba\importxml.php on line 25
$qry = "INSERT INTO TABLA".
      "(nombre, descripcion, tipo1, tipo2, cifra1)".
      " VALUES ('$XML_ART->IDART', ".
      "'$XML_ART->NOMART', ".
      "'$XML_ART->FAMART', ".
      "'$XML_ART->SFMART', ".
      $XML_ART->PRECIO.")";
Creo que la linea 25 es ahi.
prueba a concatenar las variables:
$qry = "INSERT INTO TABLA".
      " (nombre, descripcion, tipo1, tipo2, cifra1)".
      " VALUES ('$XML_ART->IDART', ".
      "'".$XML_ART->NOMART."', ".
      "'".$XML_ART->FAMART."', ".
      "'".$XML_ART->SFMART'.", ".
      "'".$XML_ART->PRECIO'."')";
También delante de (nombre... he puesto un espacio (por si no lo has visto)
No te he entendido muy bien, pero mira el código actual es este :
<?php
// Variable con el nombre del fichero a importar
$xml_file = 'WEB_ART.XML';
if (file_exists($xml_file)) {
    $xml = simplexml_load_file($xml_file);
} else {
    exit('Error al intentar abrir el fichero '.$xml_file);
}
// Todo bien asi que abrimos BD para importar
require 'config.php';    
/* Recorremos el XML */
if (!$odbc) {
die('NO hai conexion con la tabla odbc');
}
//$ruta="D:\Documents and Settings\LUCAS\Escritorio\xml\root\xml\prueba";
$ruta="D:\\Documents and Settings\\LUCASv\Escritorio\\xml\\root\\xml\\prueba";
$directorio=opendir($ruta);
while($file=readdir($directorio)){ $count=0;
foreach ($xml->ART as $XML_ART) {  
    // Inserta el libro en la tabla
   $qry = "INSERT INTO TABLA".
      "(nombre, descripcion, tipo1, tipo2, cifra1)".
      " VALUES ('$XML_ART->IDART', ".
      "'$XML_ART->NOMART', ".
      "'$XML_ART->FAMART', ".
      "'$XML_ART->SFMART', ".
      $XML_ART->PRECIO.")";
   // Ahora ejecutamos el INSERT en la BD         
  // $result = mysql_query($qry) or die(mysql_error());
// $result= odbc_exec($odbc,$qry);
$prepare = odbc_prepare($odbc,$qry);
$execute = odbc_execute($prepare,array(""));
}
closedir($directorio);
// echo "$qry";
   // Incrementamos contado para ver cuantos libros se importan.
   $count++;
}
odbc_close($odbc);
echo "<br/>";
echo "-------------------------------------------<br/>";
echo "Total de libros importados: $count properties<br/>";
echo "-------------------------------------------<br/>";
?>
Mi nuevo error este:
ODBC Connection OK!!!!
Warning: opendir(D:\Documents and Settings\LUCASv\Escritorio\xml\root\xml\prueba) [function.opendir]: failed to open dir: No such file or directory in D:\Documents and Settings\LUCAS\Escritorio\xml\root\xml\prueba\importxml.php on line 19
Warning: readdir(): supplied argument is not a valid Directory resource in D:\Documents and Settings\LUCAS\Escritorio\xml\root\xml\prueba\importxml.php on line 20
-------------------------------------------
Notice: Undefined variable: count in D:\Documents and Settings\LUCAS\Escritorio\xml\root\xml\prueba\importxml.php on line 46
Total de libros importados: properties
-------------------------------------------
Ok lo que te pasa es que no lo tienes bien hecho
Tienes que hacer:
1.- Recorrer el directorio
Por cada file, abrirlo y meterlo en la bd.
Comn tu código, seria simplemente mover
$xml_file = 'WEB_ART.XML';
if (file_exists($xml_file)) {
    $xml = simplexml_load_file($xml_file);
} else {
    exit('Error al intentar abrir el fichero '.$xml_file);
}
justo antes del foreach, y en vez de
$xml_file = 'WEB_ART.XML';
poner
$xml_file =$file;
<?php
// Variable con el nombre del fichero a importar
// Todo bien asi que abrimos BD para importar
require 'config.php';    
/* Recorremos el XML */
if (!$odbc) {
die('NO hai conexion con la tabla odbc');
}
$ruta="D:\\Documents and Settings\\LUCAS\\Escritorio\\xml\\root\\xml\\prueba";
$directorio=opendir($ruta);
while($file=readdir($directorio)){ $count=0;
$xml_file = $file ;
if (file_exists($xml_file)) {
    $xml = simplexml_load_file($xml_file);
} else {
    exit('Error al intentar abrir el fichero '.$xml_file);
}
foreach ($xml->ART as $XML_ART) {  
    // Inserta el libro en la tabla
   $qry = "INSERT INTO TABLA".
      "(nombre, descripcion, tipo1, tipo2, cifra1)".
      " VALUES ('$XML_ART->IDART', ".
      "'$XML_ART->NOMART', ".
      "'$XML_ART->FAMART', ".
      "'$XML_ART->SFMART', ".
      $XML_ART->PRECIO.")";
   // Ahora ejecutamos el INSERT en la BD         
  // $result = mysql_query($qry) or die(mysql_error());
// $result= odbc_exec($odbc,$qry);
$prepare = odbc_prepare($odbc,$qry);
$execute = odbc_execute($prepare,array(""));
}
closedir($directorio);
// echo "$qry";
   // Incrementamos contado para ver cuantos libros se importan.
   $count++;
}
odbc_close($odbc);
echo "<br/>";
echo "-------------------------------------------<br/>";
echo "Total de libros importados: $count properties<br/>";
echo "-------------------------------------------<br/>";
?>
Supongo que te refieres así, pero no funciona con el "$file", le pongo el nombre del archivo o no me va.
Warning: readdir(): 5 is not a valid Directory resource in D:\Documents and Settings\LUCAS\Escritorio\xml\root\xml\prueba\importxml.php on line 17
El error que te da es que el directorio o no existe o no lo puede abrir
create un php con este código:
<?php
$ruta="D:\\Documents and Settings\\LUCAS\\Escritorio\\xml\\root\\xml\\prueba";
$directorio=opendir($ruta);
while($file=readdir($directorio)){
echo $file."<br>";
}
closedir($directorio);
?>
Y ponme si falla o no y el error si lo da
Ok, prueba otra cosa:
$ruta en vez de con \\ ponla con /
$ruta="D:/Documents and Settings/LUCAS/Escritorio/xml/root/xml/prueba";
Tanto con una ruta como con otra van ien, me quita por pantalla la liste de archivos que tienes dentro.
Pero.. una cosa, si el directorio esta lleno de formato:
Así por ejemplo
WEB_ART.xml
sds.jpg
otrodirectorio
asd.xml
¿con.php
pasa algo?
Lo que me quita es eso:
.
..
aa
art1sk0m9tpl_jpg_3050pwlaw.jpg
config.php
configoo.php
DATA.mdb
datos_en_xml.7z
dsn.dsn
importxml.php
WEB_ART.XML
WEB_ART2.XML
xml.mdb
xml.rar
Lo que tienes que hacer es el filtro por extensión que he comentado al principio y cerrar el directorio fuera del While (que creo que es el fallo que te da).
while($file=readdir($directorio)){
if(strtolower(substr($file,-3,3))=="xml") { //si las 3 ultimas en minusculas son xml entonces lo procesamos, si no, no.
$count=0;
$xml_file = $file ;
if (file_exists($xml_file)) {
    $xml = simplexml_load_file($xml_file);
} else {
    exit('Error al intentar abrir el fichero '.$xml_file);
}
foreach ($xml->ART as $XML_ART) {  
    // Inserta el libro en la tabla
   $qry = "INSERT INTO TABLA".
      "(nombre, descripcion, tipo1, tipo2, cifra1)".
      " VALUES ('$XML_ART->IDART', ".
      "'$XML_ART->NOMART', ".
      "'$XML_ART->FAMART', ".
      "'$XML_ART->SFMART', ".
      $XML_ART->PRECIO.")";
   // Ahora ejecutamos el INSERT en la BD         
  // $result = mysql_query($qry) or die(mysql_error());
// $result= odbc_exec($odbc,$qry);
$prepare = odbc_prepare($odbc,$qry);
$execute = odbc_execute($prepare,array(""));
}//del foreach
}//del if
}//del while
closedir($directorio);
Lo conseguimos, o mejor dicho lo conseguiste.
El código final por si lo quiere ver es este:
<?php
// Variable con el nombre del fichero a importar
// Todo bien asi que abrimos BD para importar
require 'config.php';    
/* Recorremos el XML */
if (!$odbc) {
die('NO hai conexion con la tabla odbc');
}
$ruta="D:/Documents and Settings/LUCAS/Escritorio/xml/root/xml/prueba";
$directorio=opendir($ruta);
while($file=readdir($directorio)){
if(strtolower(substr($file,-3,3))=="xml") { //si las 3 ultimas en minusculas son xml entonces lo procesamos, si no, no.
$count=0;
$xml_file = $file ;
if (file_exists($xml_file)) {
    $xml = simplexml_load_file($xml_file);
} else {
    exit('Error al intentar abrir el fichero '.$xml_file);
}
foreach ($xml->ART as $XML_ART) {  
    // Inserta el libro en la tabla
   $qry = "INSERT INTO TABLA".
      "(nombre, descripcion, tipo1, tipo2, cifra1)".
      " VALUES ('$XML_ART->IDART', ".
      "'$XML_ART->NOMART', ".
      "'$XML_ART->FAMART', ".
      "'$XML_ART->SFMART', ".
      $XML_ART->PRECIO.")";
   // Ahora ejecutamos el INSERT en la BD         
  // $result = mysql_query($qry) or die(mysql_error());
// $result= odbc_exec($odbc,$qry);
$prepare = odbc_prepare($odbc,$qry);
$execute = odbc_execute($prepare,array(""));
}//del foreach
}//del if
}//del while
closedir($directorio);
// echo "$qry";
   // Incrementamos contado para ver cuantos libros se importan.
   $count++;
odbc_close($odbc);
echo "<br/>";
echo "-------------------------------------------<br/>";
echo "Total de libros importados: $count properties<br/>";
echo "-------------------------------------------<br/>";
?>
Muchas gracias de verdad, no te imaginas cuanto te lo agradezco, eres mi angel de la guarda., te merecías un besazo ahora mismo, xd
¿Esta siempre atenta a las preguntas que te hacen por esta web?
Jajaja, de nada :D
Y si, estoy atento a las preguntas por aquí :D
Respuesta
1
Tienes que utilizar las funciones del sistema de archivos y las funciones de directorio.
Lo que tienes que hacer es abrir con la función opendir() (o la función dir()) el directorio que contiene los diferentes XML que quieres importar, iterar sobre su contenido (buscando los archivos que tienen extensión .XML, por ejemplo) y hacer lo que quieras con las rutas (supongo que pasárselas al importador de XML que tengas).
En el ejemplo de la función opendir(), está explicado cómo iterar sobre todos los elementos del directorio (es un iterador, es muy parecido a un array)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas