Como pasar datos de MySQL a XML con PHP

Este tutorial te mostrará como coger la información almacenada en una base de datos MySQL y pasarla a XML. Desde ahí puedes usar el XML como quieras. Esto puede ser útil para blogs, aplicaciones web, o incluso para CMS (Content Management Systems) para tu sitio o sitios web.

Utilizar XML tiene muchas ventajas:
• Es extensible. Una vez diseñado un lenguaje, es posible extenderlo con la adición de nuevas etiquetas.
• El analizador es un componente estándar, no es necesario crear un analizador específico.
• Soporta Unicode.
• Si un tercero decide usar un documento creado en XML, es sencillo entender su estructura y procesarlo.

Preparar la base de datos
Lo bueno de esto es que no tendrás que cambiar la estructura de la base de datos existente. Los únicos cambios tendrás que hacerlos en el código PHP.
Como es solo un ejemplo voy a incluir únicamente cuatro campos en la bbdd: id, nombre, email y texto y una tabla llamada tablaEjemplo.

Código PHP
Primero hay que especificar para el navegador u otra aplicacion que usará este archivo, que lo interprete como XML y no como PHP.

header("Content-type: text/xml");

El segundo paso es especificar las variables para la conexión MySQL:

$host = "localhost"; 
$user = "usuario"; 
$pass = "contraseña"; 
$database = "prueba";

Y ahora para hacer la conexión al servidor MySQL, utilizamos las variables establecidas antes:

$enlace = mysql_connect($host, $user, $pass) or die("Error MySQL."); 
mysql_select_db($database, $enlace) or die("Error base de datos.");

Una vez la conexión creada hay que ejecutar la query que deseamos. Posteriormente guardamos la consulta en la variable $resultado:

$query = "SELECT * FROM tablaEjemplo ORDER BY id ASC"; 
$resultado = mysql_query($query, $enlace) or die("Sin resultados.");

Ahora hay que crear una variable XML de datos:

$salida_xml = "<?xml version=\"1.0\"?>\n"; 
$salida_xml .= "<informacion>\n";

Las siguientes líneas son para el bucle que saca la información con la query y mantiene el bucle tanto como filas tiene nuestra base de datos.
Mysql_fetch_assoc() toma la fila actual en la base de datos y lo exporta como una matriz (array) asociativa. Esto hace mas fácil hacer un seguimiento de nuestra información, porque cuando queremos sacar varios campos solo tendremos que poner $nombreMatriz['nombreCampo'].
Las tres líneas que utilizan str_replace corrigen los caracteres incorrectos en XML que podrían causar fallos. La razón por la que solo se corrige la fila [texto] es porque es la única donde existe la posibilidad de contener esos caracteres.
Para utilizar la información sacada de la base de datos hay que poner “$fila ['id']“ entre las etiquetas XML.

for($x = 0 ; $x < mysql_num_rows($resultado) ; $x++){ 
    $fila = mysql_fetch_assoc($resultado); 
    $salida_xml .= "\t<persona>\n"; 
    $salida_xml .= "\t\t<nombre>" . $fila['nombre'] . "</nombre>\n"; 
    $salida_xml .= "\t\t<email>" . $fila['email'] . "</email>\n"; 
        // Corrigiendo caracteres incorrectos
        $fila['texto'] = str_replace("&", "&amp;", $fila['texto']); 
        $fila['texto'] = str_replace("<", "&lt;", $fila['texto']); 
        $fila['texto'] = str_replace(">", "&gt;", $fila['texto']); 
    $salida_xml .= "\t\t<texto>" . $fila['texto'] . "</texto>\n"; 
    $salida_xml .= "\t</persona>\n"; 
}

Cierro los datos XML con la variable abierta antes:

$salida_xml .= "</informacion>";

Finalmente hay que poner la cadena de salida XML:

echo $salida_xml;

Resultado final:

<?php
 
header("Content-type: text/xml");
 
$host = "localhost"; 
$user = "usuario"; 
$pass = "contraseña"; 
$database = "prueba";
 
$enlace = mysql_connect($host, $user, $pass) or die("Error MySQL."); 
mysql_select_db($database, $enlace) or die("Error base de datos.");
 
$query = "SELECT * FROM tablaEjemplo ORDER BY id ASC"; 
$resultado = mysql_query($query, $enlace) or die("Sin resultados.");
 
$salida_xml = "<?xml version=\"1.0\"?>\n"; 
$salida_xml .= "<informacion>\n";
 
for($x = 0 ; $x < mysql_num_rows($resultado) ; $x++){ 
    $fila = mysql_fetch_assoc($resultado); 
    $salida_xml .= "\t<persona>\n"; 
    $salida_xml .= "\t\t<nombre>" . $fila['nombre'] . "</nombre>\n"; 
    $salida_xml .= "\t\t<email>" . $fila['email'] . "</email>\n"; 
        // Corregiendo caracteres incorrectos
        $fila['texto'] = str_replace("&", "&amp;", $fila['texto']); 
        $fila['texto'] = str_replace("<", "&lt;", $fila['texto']); 
        $fila['texto'] = str_replace(">", "&gt;", $fila['texto']); 
    $salida_xml .= "\t\t<texto>" . $fila['texto'] . "</texto>\n"; 
    $salida_xml .= "\t</persona>\n"; 
}
 
$salida_xml .= "</informacion>";
 
echo $salida_xml;
 
?>

Consultas más exactas
También existe la posibilidad de hacer consultas más exactas.
Especificando una variable, mediante un formulario o a través de la url:

//Para formulario hay que usar POST
$varUnic = $_POST['varUnic']; 
//Directamente desde la url con GET
$varUnic = $_GET['varUnic'];

Después de esto solo hay que modificar la query:

$query = "SELECT * FROM tablaEjemplo WHERE varUnic=$varUnic";

Comentarios

17 respuestas para “Como pasar datos de MySQL a XML con PHP”

  1. DbRunas - Como pasar datos de MySQL a XML con PHP a las 19:18 el 21 de Dec del 2007

    [...] aplicaciones web, o incluso para CMS (Content Management Systems) para tu sitio o sitios web.Mas: http://www.bujorel.net/tutorial/como-pasar-datos-de-mysql-a-xml-con-php/ [...]

  2. Djdanisam a las 22:08 el 15 de Oct del 2008

    Muy buen ejemplo es lo que necesitaba gracias Bj.

  3. Fernando a las 1:42 el 15 de Nov del 2008

    He hecho alguna variacion en el script como es el include de conexion y adaptar los datos a una tabla, pero me da el siguiente error:
    “La etiqueta de fin ‘br’ no coincide con la etiqueta de inicio ‘html’. Error al procesar el recurso http://localhost/plazos/...


    El script completo es:
    <?php
    header(”Content-type: text/xml”);
    include”conecta1.php”;

    $query = “SELECT * FROM empresas ORDER BY id_empresas ASC”;
    $resultado = mysql_query($query) or die(”Sin resultados.”);

    $salida_xml = “\n”;
    $salida_xml .= “\n”;

    for($x = 0 ; $x < mysql_num_rows($resultado) ; $x++){
    $fila = mysql_fetch_assoc($resultado);
    $salida_xml .= “\t\n”;
    $salida_xml .= “\t\t” . $fila['id_empresas'] . “\n”;
    $salida_xml .= “\t\t” . $fila['cif'] . “\n”;
    $salida_xml .= “\t\t” . $fila['nombre'] . “\n”;
    $fila['notas'] = str_replace(”&”, “&”, $fila['notas']);
    $fila['notas'] = str_replace(”", “>”, $fila['notas']);

    $salida_xml .= “\t\n”;
    }

    $salida_xml .= “”;

    echo $salida_xml;

    ?>
    Te agradezco tu ayuda, estaba buscando algo asi.-

  4. Bj a las 9:59 el 16 de Nov del 2008

    Al ser PHP el archivo no contiene ni BR ni HTML como ves arriba.

  5. Fernando a las 12:23 el 16 de Nov del 2008

    Gracias por tu rápida contestación.-Ya he conseguido que funcione.-Ahora tengo otro problema distinto.-Al sacar los datos de la BD cuando encientra un tilde,una ñ o similar me dice caracter desconocido.-¿me puedes ayudar a darle solución.-

  6. Alberto a las 10:52 el 28 de Nov del 2008

    Tienes que reemplazar todos esos caracteres ya que no son validos para el xml. Te envío un ejemplo de caracteres que tienes que sustituir.

    Y como sustituirlos.

    strtolower(strtr($valor['name'],$trans))

    //Array con caracteres a sustituir
    $trans = array(”á” => “a”, “é” => “e”, “í” => “i”, “ó” => “o”,”ú” => “u”, “ñ” => “n”, “Á” => “a”, “É” => “e”, “Í” => “i”, “Ó” => “o”,”Ú” => “u”, “Ñ” => “n”, “ç” => “c”, “Ç” => “c”, “ü” => “u”, “Ü” => “u”, “‘” => “-”, ” ” => “_”, “,” => “-”, “/” => “-”, “(” => “”, “)” => “”, “à” => “a”, “è” => “e”, “ì” => “i”, “ò” => “o”, “ù” => “u”, “ä” => “a”, “ë” => “e”, “ï” => “i”, “ö” => “o”, “´” => “-”, “`” => “-”, “.” => “-”, “&” => “”, “?” => “”, “¿” => “”, “@” => “-”, “!” => “”, “%” => “”, “ã” => “a”, “â” => “a”, “ß” => “B”, “ê” => “e”, ” / ” => “_”);

  7. maurico a las 2:33 el 16 de Jan del 2009

    yo soy muy nuevo en esto hago el ejemplo en localhost y con la misma bd pero me sale esto en en navegador cuando la veo

    No se puede mostrar la página XML
    No se puede ver la entrada XML con la hoja de estilo . Corrija el error y haga clic en el botón Actualizar, o inténtelo de nuevo más tarde.

    favor una ayuda solo encontre este tutorial que creo esta bueno, pero yo soy medio lento gracias

  8. Bj a las 2:38 el 16 de Jan del 2009

    ¿Puedes subir en alguna parte el archivo XML generado? Tienes que guardarlo…

    De todos modos, sí abres la página con Firefox te dirá el error, o por lo menos la línea que falla.

  9. Hugo a las 5:05 el 25 de Jan del 2009

    es bien el ejemplo.
    pero pienso que para resolver el problema de caracteres podrian colocar el texto dentro de secciones CDATA, ejemplo:

    Asi desde el Flash puede recuperar la informacion
    la propiedad nodeValue o pueden usar firstChild si el nodeValue le arroja NULL

  10. joe a las 7:38 el 29 de Jan del 2009

    Como guardo el documento como .xml o como php?

  11. Gary a las 3:55 el 8 de Feb del 2009

    uhmm si pues falto decir como guardarlo…
    hasta hace un poco un amigo me dijo q los manejos de archivos era una tonteria y estaban de mas error ps te sacan de apuros como este.
    crea un archivo cualquiera en donde pondras el script q esta acontinuacion y tambien crea otra hoja pero con el nombre documento.xml

    esto ara q el archivo se guarde y el w+
    ara q el archivo se genere y se refreske en cada cambio ps si quieres darle otra forma de guardar y manejar archivo te aconsejo q revises el tema manejo de archivos ahi podras jugar mejor
    con los modos de abrir archivos bueno espero q te sirva tales como a, r, w

    sacrifica tus sueños para q logres tus sueños…

  12. Gary a las 3:56 el 8 de Feb del 2009

    $file=fopen(”documento.xml”,”w+”);
    $cadena=”$salida_xml”;
    fputs($file,$cadena);
    fclose($file);

  13. Skoni a las 5:24 el 13 de Feb del 2009

    Hola Gary!

    Tu ultimo código para guardar el archivo, cómo lo vinculo con el archivo que hará la consulta? No veo como relacionarlo.

    Lo que si es que me marca error en “$cadena=”$salida_xml”;” ahí marca error, no procesa esa linea, porque?

    Yo como quiero estructurar mi pagina es para actualizar noticias, así tengo la estructura de sa seccion:

    Login->Formulario de actualización->PHP->MySQL->PHP->XML->Flash

    Mi problema radica en: “…MySQL->PHP->XML…” Ojalá me puedas ayudar, ya que no hallo la forma de implementar un script que funcione. :(:(:(

    Saludos!

  14. Skoni a las 19:58 el 16 de Feb del 2009

    Solucioné mi problema =)=) solo elimine el XML cambiando mi proceso de salida de este:

    MySQL => PHP => XML => SWF

    a este:

    MySQL => PHP => SWF

    Funcionó perfectamente, solo tengo el problema de que no puedo optimizar los scripts jeje, en total son 16 scripts para 8 noticias.

    Saludos!

  15. Gary a las 5:55 el 5 de Mar del 2009

    Saludos cordiales uhm
    veo q te sirvio de algo q bueno =) despues de tiempo chekeo esta pagina o te hubiese ayudado con el porblema anterior
    weno pasaba no mas adios

    cualquier duda pasa la voz pues tratare de ayudar
    bye !

    sacrifica tus sueños para q logres tus sueños…

  16. jemalo a las 9:43 el 2 de Apr del 2009

    waaaoooww !!!
    esta de poca el codigo..

    woowww..
    me saco de apuros.. tengo que entregar un proyecto
    y encontre este codigo para hacer un XML
    woowwww… de nuevo…

    te felicito..

    saludos…

  17. mauricio a las 16:38 el 27 de May del 2009

    hola gente
    muy bueno el ejemplo, estaba armando algo esactamente igual
    para los simplificar el reemplazo de caracteres lo solucione de otra forma

    $salida_xml .= “\t\t” . utf8_encode($fila['nombre']) . “\n”;

    espero les sirva, saludos

Deja una respuesta