Desarrollemos en PHP una plantilla para generar XML

7 agosto, 2010

Fácil de entender, no te preocupes… si te preguntas en estos momentos ¿Cómo puedo generar un Script PHP que me devuelva un Documento XML?; bien tomemos como base que generaremos un Documento XML Bien Formado con formato RSS 2.0 -si no no sabes lo que hemos estamos hablando, ingresa aquí para que tengas un mejor panorama-.

Existen varios caminos para generar un Documento XML en PHP, y el que hemos tomado esta divido por tres archivos PHP, el primer archivo genérico es para conectar alguna base de datos, el segundo archivo PHP es para dar el formato RSS 2.0 al Documento XML; por último dejaremos el archivo encargado de poblar las etiquetas item que contiene un XML con RSS 2.0. Veamos primero el archivo que hará la conexión a una base de datos SQL.

<?php
//Este archivo puede ser nombrado como connectDB.php

$db_host = 'localhost';
$db_user = 'root';
$db_pass = '';
$db_name = 'informacion';
mysql_connect($db_host, $db_user, $db_pass);
mysql_select_db($db_name);

?>

En este archivo utilizamos datos de prueba, en el caso hemos digitado el nombre del localhost que utilizamos en el servidor remoto, si no posee usuario y contraseña con la base de datos que estas utilizando entonces sería root y no tendrías que declarar nada en el password, con respecto a la base de datos es aquí donde señalizamos cual es la base de datos que utilizaremos por ejemplo en nuestro caso es informacion. Y con toda esta información hacemos la conexión a la base de datos y luego indicamos la base que utilizaremos.

Ahora pasemos al segundo Script PHP que dará el formato RSS 2.0 al documento XML que generemos.

<?php
//Este archivo lo puede llamar introXML.php

$xml = new DomDocument('1.0', 'UTF-8');
$root = $xml->createElement('rss');
$root->setAttribute('version', '2.0');
$root = $xml->appendChild($root);
$channelElement = $xml->createElement('channel');
$channelElement = $root->appendChild($channelElement);
$titleElement = $xml->createElement('title','Consulta de Datos');
$titleElement = $channelElement->appendChild($titleElement);
$linkElement = $xml->createElement('link','http://localhost:8088/GestionDatos/');
$linkElement = $channelElement->appendChild($linkElement);
$descriptionElement = $xml->createElement('description','Aplicaciòn de Gestion de Datos');
$descriptionElement = $channelElement->appendChild($descriptionElement);

?>

El código puede aparentar difícil, pero si te fijas lleva una secuencia -bastante logica- y no tienes donde perderte. Dentro de la variable $xml creamos el Documento XML con la versión 1.0 y la codificación UTF-8, luego creamos un nodo raiz llamado rss y con setAttribute le colocamos como atributo la versión 2.0, posteriormente con appendChild insertamos el nodo al Documento XML.

Ojo con la secuencia lógica… luego creamos un nuevo elemento o nodo hijo llamado channel y lo guardamos dentro de $channelElement, a este no le colocamos ningun atributo y con la sentencia appendChild lo asignamos como hijo de $root. Posteriormente creamos el nuevo elemento title y le colocamos el valor de Consulta de Datos -esto lo almacenamos dentro de $titleElement-,  y luego con appendChild se lo colocamos como hijo de channel. Y así sucesivamente; aclaro que en este punto no esta completo el XML ya que necesitamos incluir otra secuencia de código con el tercer Script PHP, puesto que este Script es solo para para generar la especificación del XML.

Pero… ¿Cómo vamos a utilizar estos dos archivos? sencillo! los llamaremos con un include dentro del tercer Script PHP que generará el XML. El Script que desarrollaremos a continuación se compondrá de las siguientes partes: el encabezado, la captura de datos, la consulta realizada, la validación de la consulta, la captura de los datos recibidos por la consulta y el almacenamiento del Documento XML. Empecemos por el encabezado que llevara el archivo.

<?php
//El archivo lo puedes llamar generaXML.php
header('Content-Type: text/xml');

include 'connectDB.php';
include 'introXML.php';

?>

En la parte del encabezado incluiremos un header para indicarle al navegador la transferencia de datos XML, luego se implementan los include necesarios para hacer la conexión a la base de datos y la escritura de la especificación del Documento XML. Veamos a continuación la captura de datos.

$capturaNombre = $_POST['capturaNombre'];
$capturaApellido = $_POST['capturaApellido'];

Hemos utilizado el método POST para capturar los datos que serán pasados por el objeto URLVariables de ActionScript 3.0, aclaramos que debes de tener cuidado con respecto al nombre del atributo que utilices dentro del objeto URLVariables, en este ejemplo estamos capturando los valores de capturaNombre y capturaApellido, esto quiere decir que en el archivo ActionScript tendrá que enviarse estos parametros  con los mismos nombres, asi:

var capVrs:URLVariables = new URLVariables();
capVrs.capturaNombre = "Juan";
capVrs.capturaApellido = "Pérez";

Con respecto a la consulta de datos, no es más que la gestiòn de una consulta a la base de datos. Esta es cualquier consulta que se realice a la base, pondremos una consulta de ejemplo a continuación:

$sql = "SELECT nombre, apellido, fechaNac, email
        FROM datos
        WHERE (nombre = '$capturaNombre')";

En el siguiente codigo veremos primero el envio de la consulta y la validación, que esta compuesta por la anidación del los dos if y el ciclo while, el primer condicional if verifica si no ha ocurrido algun error en la consulta a la base de datos, el segundo if verifica si la consulta ha devuelto información de la base de datos y siendo el caso verdadero entonces se procede en recorrer el resultado recibido con una iteración while y los valores devueltos por la base de datos son almacenados en variables. A la vez por cada iteración del ciclo while se creara un elemento item donde tendrá como hijos a nombre, apelllido, fechaNac y email.

$result = mysql_query($sql);

if ($result) {
   if (mysql_num_rows($result) > 0) {
      while ($row = mysql_fetch_array($result)) {
         $nombre = $row['nombre'];
         $apellido = $row['apellido'];
         $fechaNac = $row['fechaNac'];
         $email = $row['email'];

         $itemElement = $xml->createElement('item');
         $itemElement = $channelElement->appendChild($itemElement);

         $nombreElement = $xml->createElement('nombre', $nombre);
         $nombreElement = $itemElement->appendChild($nombreElement);

         $apellidoElement = $xml->createElement('apellido', $apellido);
         $apellidoElement = $itemElement->appendChild($apellidoElement);

         $fechaNacElement = $xml->createElement('fechaNac', $fechaNac);
         $fechaNacElement = $itemElement->appendChild($fechaNacElement);

         $emailElement = $xml->createElement('email', $email);
         $emailElement = $itemElement->appendChild($emailElement);
      } // Cierre del Bucle While
    } // Cierre del if que verifica si ha encontrado información
   else {
      $messageElement = $xml->createElement('message', 'Información no encontrada.');
      $messageElement = $channelElement->appendChild($messageElement);
   } // Cierre del else
} // Cierre del if que verifica si ha ocurrido algún error en la base de datos
else {
   $messageElement = $xml->createElement('message', mysql_error());
   $messageElement = $channelElement->appendChild($messageElement);
} // Cierre del else

echo $xml->saveXML();
?>

El final del código no son más que los mensajes que pueden ser devueltos de la consulta a la base de datos, ejemplo, no se encontro información, o ha ocurrido un error en la consulta. Por último guardamos el XML creado con la función saveXML. Para tener un mejor panorama sobre lo que hemos creado veamos el código completo:

<?php
//El archivo lo puedes llamar generaXML.php

header('Content-Type: text/xml');

include 'connectDB.php';
include 'introXML.php';

$capturaNombre = $_POST['capturaNombre'];
$capturaApellido = $_POST['capturaApellido'];

$sql = "SELECT nombre, apellido, fechaNac, email
        FROM datos
        WHERE (nombre = '$capturaNombre')";

$result = mysql_query($sql);

if ($result) {
   if (mysql_num_rows($result) > 0) {
      while ($row = mysql_fetch_array($result)) {
         $nombre = $row['nombre'];
         $apellido = $row['apellido'];
         $fechaNac = $row['fechaNac'];
         $email = $row['email'];

         $itemElement = $xml->createElement('item');
         $itemElement = $channelElement->appendChild($itemElement);

         $nombreElement = $xml->createElement('nombre', $nombre);
         $nombreElement = $itemElement->appendChild($nombreElement);

         $apellidoElement = $xml->createElement('apellido', $apellido);
         $apellidoElement = $itemElement->appendChild($apellidoElement);

         $fechaNacElement = $xml->createElement('fechaNac', $fechaNac);
         $fechaNacElement = $itemElement->appendChild($fechaNacElement);

         $emailElement = $xml->createElement('email', $email);
         $emailElement = $itemElement->appendChild($emailElement);
      } // Cierre del Bucle While
   } // Cierre del if que verifica si ha encontrado información
   else {
      $messageElement = $xml->createElement('message', 'Información no encontrada.');
      $messageElement = $channelElement->appendChild($messageElement);
   } // Cierre del else
} // Cierre del if que verifica si ha ocurrido algún error en la base de datos
else {
   $messageElement = $xml->createElement('message', mysql_error());
   $messageElement = $channelElement->appendChild($messageElement);
} // Cierre del else

echo $xml->saveXML();
?>

Con esto finalizamos la plantilla para generar XML con PHP, este código es fácilmente adaptable y conforme a la cantidad de datos devueltos por la consulta a la base de datos así tendras que incrementar o quitar los elementos o nodos que serán enviados como Documento XML. Veamos un ejemplo de como seria devuelto una consulta a la base de datos.

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
   <channel>
      <title>Consulta de Datos</title>
      <link>http://localhost:8088/GestionDatos/</link>
      <description>Aplicación de Gestión de Datos</description>
      <item>
         <nombre>Juan</nombre>
         <apellido>Pérez</apellido>
         <fechaNac>01/01/1900</fechaNac>
         <email>perez.juan@mail.com</email>
      </item>
   </channel>
</rss>

Hola, espero te haya gustado y te sea util la información que hayas encontrado, esperamos que sigas aprendiendo y te invito a que revises todo el blog. Mientras estaremos preparando la información dentro del blog para que puedas encontrar diversos temas referentes a Flex Builder 3 y ActionScript 3.0.

Apoya al proyecto rias4u ingresando aquí!!! =D




Características de un XML con formato RSS

7 agosto, 2010

Si creas una aplicación o sitio web que genere XML es muy recomendable que implementes tus RSS con la versión 2.0, así te asegurarás que al momento de compartirlos estos serán compatibles por los otros sitios donde sean distribuidos.

Pero para entender sobre el formato RSS dentro de un XML, veamos el siguiente código donde se muestra la estructura de un XML con este formato:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<rss version="2.0">
   <channel>
      <title>El nombre del Feed a publicar</title>
      <link>La dirección del sitio web</link>
      <description>Breve descripción del contenido a ofrecer</description>
      <item>
         <title>Título</title>
         <link>Dirección de donde se encuentra el detalle de la información</link>
         <description>Descripción de la información</description>
      </item>
   </channel>
</rss>

El Documento empieza con la declaración de la versión 1.0 del XML y la compatibilidad de la codificación que es ISO-8859-1, esta especificación es para hacer frente a los caracteres que llevan acentos, sino especifica la codificación se supondrá que el documento utilizará UTF-8.

Si te fijas el XML posee una etiqueta padre llamada channel, siendo asi, entonces las etiquetas hijos son title, link, description e item; cabe mecionar que la etiqueta channel podrá tener tantas etiquetas item como sea necesario. Hagamos un parentesis en este punto… (En el post donde creamos la clase DatosLoader, es a esta etiqueta channel que hacemos referencia cuando se la asignamos a la variable xmlListDatos, quiere decir que esta variable contendrá todas las etiquetas item que channel posea).

¿Deseas saber cómo generar un Documento XML con Formato RSS en PHP?… perfecto!!! entonces entra aquí!!!.

Hola, espero te haya gustado y te sea util la información que hayas encontrado, esperamos que sigas aprendiendo y te invito a que revises todo el blog. Mientras agilizare el proceso de edición de información dentro del blog para que puedas encontrar diversos temas referentes a Flex Builder 3 y ActionScript 3.0.

Apoya al proyecto rias4u ingresando aquí!!! =D


<?xml version=»1.0″ encoding=»ISO-8859-1″ ?>
<rss version=»2.0″>
<channel>
<title>El nombre del Feed a publicar</title>
<link>La dirección del sitio web</link>
<description>Breve descripción del contenido a ofrecer</description>
<item>
<title>Título</title>
<description>Descripción de la información</description>
</item>
</channel>
</rss>