Ultimamente he tenido que realizar algunas pruebas de importación de datos provenientes de un fichero XML a tablas de una base de datos en mySQL. Y bueno con PHP 5 me resultó bastante sencillo, ya que incorpora (por defecto) la extensión simpleXML que facilita mucho las cosas.

Para este ejemplo necesitaremos crear 2 ficheros en php, uno con la configuración y conexión a la base de datos, y otro con el script de importación en si. Además del fichero XML que vamos a importar. Y evidentemente necesitaremos tener creada las tablas a la que vamos a importar.

Empecemos mostrando la estructura del fichero XML a importar.

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?><root>    <libro>        <ref>XLT-5841AHJ</ref>        <precio>29.95</precio>        <editorial>Editorial Planeta</editorial>        <titulo>Nunca es tarde para aprender</titulo>        <autor>J.M.Navarro</autor>        	<desc>Ensayo sobre la necesidad de estar en constante fase de aprendizaje a lo largo de nuestra vida, su repercusión en nuestra vida, en todas sus etapas y los beneficios que ello reportar sobre nuestra salud tanto mental como física</desc>        <images>            <image id="1">                <url>http://images.leemiblog.com/1_large.jpg</url>                <titulo>Portada grande</titulo>            </image>            <image id="2">                <url>http://images.leemiblog.com/2_large.jpg</url>                <titulo>Contraportada</titulo>            </image>            <image id="3">                <url>http://images.leemiblog.com/foto_autor.jpg</url>                <titulo>Foto del autor</titulo>            </image>        </images>    </libro>    <libro>         .        .        .    </libro>    .    .    .</root>

Partiendo de esta estructura de nuestro fichero XML a importar deberemos crear nuestro script para que sea capaz de importar estos datos directamente en una tabla mysql que tendremos que haber creado anteriormente. Además dicha base de datos deberá incorporar al menos dos tablas para que sea capaz de incorporar eficientemente esta estructura en la que un libro tiene asociada una serie de imágenes, aunque podríamos hacerlo con una sola en la que tener triplicados los campos url de la imagen y su descripción, me ha parecido más didáctico e interesante hacerlo en dos tablas. Dando así solución a un problema bastante común como la división en distintas tablas de un único fichero XML.

Ahora veremos el código php necesario para realizar la importación. En primer lugar tendremos un fichero de configuración con los datos de conexión y los comandos necesarios para realizar dicha conexión a la base de datos mySql.

/*************************************************************** * Conection Params Page - config.php * Author: J. Manuel Navarro ( http://www.manuelnavarro.com ) * * Parametros de conexión a la base de datos. ***************************************************************/<?php$dbhost='localhost';$dbusername='nombre_usuario'; $dbuserpass='clave_usuario';$dbname = 'nombre_bd';// Ahora conectamos a la base de datos.mysql_connect ($dbhost, $dbusername, $dbuserpass);// y la seleccionamos  para poder trabajar con ella.mysql_select_db($dbname) or die('Cannot select database');?>

A este fichero pocos comentarios, así que pasaremos al script de importación no si antes comentar que las tablas tienen un campo ID de tipo entero, definida como clave primaria y con auto-incremento. Así que al añadir el libro a la tabla necesitaremos recuperar dicho ID (generado automaticamente) para relacionar el último libro añadido con las imagenes.

/*************************************************************** * Conection Params Page - importxml.php * Author: J. Manuel Navarro ( http://www.manuelnavarro.com ) * * Script ejemplo de importación de XML a mySql con PHP 5 ***************************************************************/

// Variable con el nombre del fichero a importar$xml_file = 'libros.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 importarrequire 'config.php';    

/* Recorremos el XML */$count=0;foreach ($xml->libro as $libro) {      // Inserta el libro en la tabla    $qry = "INSERT INTO libros ".      "(codigo, titulo, editorial, autor, descripcion,precio)".      " VALUES ('$libro->ref', ".      "'$libro->titulo', ".      "'$libro->editorial', ".      "'$libro->autor', ".      "'$libro->desc', ".      $libro->precio.")";

   // Ahora ejecutamos el INSERT en la BD            $result = mysql_query($qry) or die(mysql_error());

   // Y necesitamos recuperar el ultimo ID para relacionar sus imagenes   $libro_id = mysql_insert_id ();   

    // Y ahora sus imágenes (en este caso tiene 3)   for ($i=1;$i<=3;$i++) {     $img_url = $libro->images->image[$i]->url;                $img_des = $libro->images->image[$i]->titulo;       $qry = "INSERT INTO img_libros (libro_id, url, descripcion) ".           "VALUES ($libro_id, '$img_url', '$img_des')";                 $result = mysql_query($qry) or die(mysql_error());          }  

   // Incrementamos contado para ver cuantos libros se importan.   $count++;}

echo "<br/>";echo "-------------------------------------------<br/>";echo "Total de libros importados: $count properties<br/>";echo "-------------------------------------------<br/>";

?>

Las funciones claves para la importacion son simplexml_load_file que

carga el fichero XML interpretandolo como un objeto, lo cual simplifica

mucho su manipulación, permitiendonos recorrer todo el fichero con la
función en PHP “foreach ($xml->libro as $libro)” teniendo así para
cada registro de un libro en el XML la oportunidad de obtener sus
valores a través de la variable $libro la cual es un objeto con todas
las propiedades definidas en el XML. El resto del código se encarga de
inserta el registro en la base de datos y luego recorremos las imágenes
del libro para igualmente insertarlas en la correspodiente tabla.
Destacando aquí el uso de la función mysql_insert_id() para obtener el
valor del ID del último registro insertado en la tabla libros.

 CREATE TABLE libros (  id int(4) unsigned NOT NULL auto_increment,  codigo varchar(15) default NULL,  ti
tulo varchar(30) default NULL,  editorial varchar(25) NOT NULL,  autor varchar(30) default NULL,  descripcion varchar(500) default NULL,  precio decimal(10,0) default NULL,  PRIMARY KEY  (id));

CREATE TABLE img_libros (  id int(4) NOT NULL auto_increment,  libro_id int(4) NOT NULL,  url varchar(250) NOT NULL,  descripcion varchar(30) default NULL,  PRIMARY KEY  (id));
Bueno espero que les haya sido de utilidad este rápido vistazo a la

importación de XML y dejen sus comentarios al respecto. Hasta el
próximo post!





¿Te gusto la entrada? Compartela:

Etiquetas: , ,

2 Responses


  1. mario on 02 ago 2011

    Hubiera estado bien un poco mas de orden en las secciones en las que insertas codigo.
    Pero me sirvió.
    Gracias

  2. Santiago on 31 oct 2011

    No lo he probado aún, pero si funciona estaba buscando algo así desde hace tiempo, Gracias por el aporte.


Leave your comment