formateado de datos en xml
Ahora que ya he explicado cómo crear una clase en php para leer datos de una base de datos, y que también conocemos las bases del lenguaje xml, vamos a crear una clase para formatear estos datos en xml. De este modo, podremos compartir datos entre distintos tipos de aplicaciones, sin necesidad de tener acceso al servidor de bases de datos más que en una de ellas: la pasarela de datos.
Una vez formateamos en correcto xml, podemos ofrecer un documento como xml puro para aplicaciones externas que quieran utilizar nuestros datos, o un rss estándar para que nuestros visitantes sincronicen las noticias del sitio; podemos también ofrecer un servicio soap para aplicaciones que no sólo precisen nuestros datos sino también funciones y servicios avanzados; o podemos simplemente adjuntar una hoja de estilos xls y mostrar nuestro documento en un navegador, como lo haríamos con xhtml y css. Bastante útil, ¿no?
Vamos allá : para la clase necesitaremos algunas propiedades que permitan almacenar el contenido, así como un constructor, un método para cargar datos (en arrays multidimensionales), y otro método para recuperarlos (como arrays). También necesitaremos un método toString(), o toXML más propiamente hablando para formatear directamente los datos a xml. Comencemos con el prototipo de la clase:
class xml {
//
var $content;
var $xml_version;
var $xml_encoding;
var $data_label;
var $item_label;
//
//
/** constructor; carga algunos valores por defecto
*/
public function xml() {}
//
//
/** Recibe los datos a mostrar en una matriz de dos dimensiones,
* y los almacena internamente
*/
function setContent($data = NULL) {}
//
/** Devuelve el contenido de la matriz
*@return el contenido de la matriz
*/
function getContent() {}
//
/** Muestra en cadena de texto los valores con formato xml
*@return los datos en formato xml
*/
function toString() {}
//
/** Devuelve la cabecera xml
*@return la cabecera xml
*/
function header(){}
//
}
Para la matriz de datos, esperamos un array asociativo, donde cada elemento $content[] tenga el valor asociado al índice, correspondiente al nombre del campo de la tabla. Por ejemplo, en nuestra tabla ’superheroes’ con los campos ‘id’, ‘name’, ’special_powers’, la matriz que la clase espera obtener es del tipo:
$content[0]['id'] = "101";
$content[0][name'] = "hombre araña";
$content[0]['special_powers'] = "trepar por las paredes";
$content[1]['id'] = "102";
$content[1]['name'] = "hombre mosquito";
$content[1]['special_powers'] = "huir del hombre araña";
....
y el formato xml que esperamos de salida es
<data>
<item id="101" name="hombre araña" special_powers="trepar por las paredes"></item>
<item id="102" name="hombre mosquito" special_powers="huir del hombre araña"></item>
...
</data>
podemos elegir varios formatos para el xml de salida, en concreto usaremos el anterior, sin embargo podríamos haber utilizado un formato anidado del tipo
<data>
<item>
<id>101</id>
<name>hombre araña</name>
<special_powers>trepar por las paredes</special_powers>
</item>
<item>
<id>102</id>
<name>hombre mosquito</name>
<special_powers>huir del hombre araña</special_powers>
</item>
</data>
Elijo el primer formato por sencillez, y porque siendo yo quien voy a leer de él en otras aplicaciones, no tengo que preocuparme por la compatibilidad. Si vamos a integrar nuestra pasarela xml con otros servicios o aplicaciones web, quizá nos interese saber primero qué formato espera encontrar dicha aplicación para ofrecerle datos que le resulten legibles.
Por otra parte, si se usa la clase dbhandler para proporcionar los datos en arrays a esta clase, debe modificarse la función readTable para que quede así
/* consulta los campos seleccionados de una tabla concreta de la base de datos
*@param table la tabla concreta
*@param fields los campos a consultar
*/
function readTable($table,$fields)
{
//variables
$resultsArray = array();
//campos
$fieldsList = "";
foreach($fields as $key=>$value)
{
$fieldsList .= $value . ",";
}
//quitamos la última coma
$fieldsList = substr($fieldsList,0,strlen($fieldsList)-1);
//consulta
$this->query = "SELECT " . $fieldsList . " FROM " . $table;
$this->resultset = @mysql_query($this->query,$this->identifier);
$this->results = @mysql_num_rows($this->resultset);
if ( $this->results > 0)
{
$i = 0;
while ($result = mysql_fetch_array($this->resultset))
{
foreach($fields as $key=>$index)
{
$resultsArray[$i][$index] = $result[$index] ; //devuelvo los resultados en una matriz asociativa
// a cada resultado le asigno un indice con el nombre del campo de la tabla, y su valor
}
$i++;
}
}
return($resultsArray);
}
Sólo queda rellenar el prototipo con el contenido de las funciones:
/* clase para formateado de datos en xml
* @author Jorge Albaladejo Pomares [jorge@abc-webs.net]
* @license Creative Commons License http://creativecommons.org/licenses/by-sa/3.0/
*/
//
class xml {
//
var $content;
var $xml_version;
var $xml_encoding;
var $data_label;
var $item_label;
//
//
/** constructor; carga algunos valores por defecto
*/
public function xml() {
$this->content = array();
$this->xml_version = "1.0";
$this->xml_encoding = "ISO-8859-1";
$this->data_label = "datos";
$this->item_label = "item";
}
//
//
/** Recibe los datos a mostrar en una matriz de dos dimensiones,
* y los almacena internamente
*/
function setContent($data = NULL) {
if ($data != NULL) {
$this->content = $data;
}
}
//
/** Devuelve el contenido de la matriz, eliminando los indices duplicados si se especifica
*@return el contenido de la matriz
*/
function getContent() {
return ($this->content);
}
//
/** Muestra en cadena de texto los valores con formato xml
*@return los datos en formato xml
*/
function toString() {
if ($this->content != NULL) {
$return = "";
$return .= $this->header();
$return .= "<".$this->data_label.">\n";
//para cada elemento de la matriz, hay una matriz de datos con los índices del resultado mysql
foreach ($this->content as $result)
{
$return .= "\t<".$this->item_label;
foreach( $result as $key => $value ) {
$return .= " " . $key . "=\"" . $value ."\"";
}
$return .= "/>\n";
}
$return .= "data_label.”>”;
}
return ($return);
}
//
/** Devuelve la cabecera xml
*@return la cabecera xml
*/
function header(){
return (”xml_version.”\” encoding=\”".$this->xml_encoding.”\”?>\n”);
}
//
Y un script que utilice estas dos clases (dbhandler y xml) para mostrar datos de una base de datos nos quedaría tan sencillo como ésto:
/* script para conexión con base de datos y lectura de tablas, organizado en funciones
* @author Jorge Albaladejo Pomares [jorge@abc-webs.net]
* @license Creative Commons License http://creativecommons.org/licenses/by-sa/3.0/
*/
//
//main classes
include('class.dbhandler.php');
include('class.xml.php');
//main script
$db = new dbhandler('john_smith','h01y_GRail','pastafarian_food','localhost');
$fields = array('id', 'name', 'special_powers');
$results = $db->readTable('superheroes',$fields,$token);
$xml = new xml();
$xml->setContent($results);
$db->disconnect($token);
//hemos obtenido los datos, ahora los mostramos en xml
header('Content-Type: text/xml');
echo $xml->toString();
Un Comentario para “formateado de datos en xml”
[…] formateado, bien estático y alojado en cualquier carpeta del servidor, bien una url a una pasarela php que previamente lea los datos de una base de datos y después los muestre en xml. Vamos a necesitar tres cosas: un objeto LoadVars, un objeto XML y […]
Deja tu comentario
Si tu comentario no aparece inmediatamente no te preocupes, los comentarios se moderan antes de publicarlos por problemas con los spammers. Cuando hayas enviado varios comentarios y seas una persona de confianza, tus comentarios aparecerán inmediatamente sin necesidad de moderación.







abc-webs.net laboratorio de código libre » Blog Archive » cargar datos en flash desde un xml externo
28 de Mayo de 2007 a las 2:05 pm