¿Qué podemos hacer con XML y PHP ?
Quizás de primeras no seamos conscientes del potencial de estas dos tecnologías juntas, pero si nos fijamos bien, podemos darnos cuenta de que XML y PHP pueden funcionar de una forma muy similar a como puede trabajar PHP con una base de datos.
30/5/06 - Aunque utilizar estas dos tecnologías juntas no excluye usar bases de datos, ¡eso es lo mejor de todo!.
En la segunda parte de este artículo veremos con juntar estas tres tecnologías para darle rienda suelta a nuestra imaginación.
Vamos al lío.
Para empezar vamos a crear nuestro archivo XML de ejemplo, al que llamaremos "noticias.xml" (por ser un poquito originales ;-) ):
<?xml version="1.0" encoding="ISO-8859-1"?>
<bloque>
<noticia>
<titulo>Hola Caracola </titulo>
<autor>KaoS</autor>
<cuerpo>Olla Kaitos a Luisete</cuerpo>
</noticia>
<noticia>
<titulo>Nuevo articulo en desarrolloweb </titulo>
<autor>Raul</autor>
<cuerpo>Jeje hola, aqui estamos </cuerpo>
</noticia>
</bloque>
Bueno ya tenemos creado nuestro archivo XML, que como ya sabemos nos permite crear nuestras propias etiquetas, aunque según en que estemos trabajando será recomendable seguir los estandarés establecidos por el w3c.
Ahora necesitamos crear un archivo PHP que lea nuestro archivo "noticias.xml".
¿Como podemos hacer esto? , pues es muy simple, porque PHP ya incluye ciertas funciones para el trabajo con archivos XML.Nosotros vamos a utilizar unas funciones que trabajan sobre PHP 4 ya que aún no todo el mundo tiene PHP 5 en su servidor, pero la forma de trabajar es muy similar. Dejo aquí una referencia de como trabajar del mismo modo pero usando las funciones de PHP 5.
Vamos a trabajar.
Lo primero que tenemos que hacer es leer el archivo, para ello utilizaremos nuestra queridísima función fopen. Da igual si el archivo se encuentra en nuestro servidor o no, por lo que si nos interesa podriamos crear un archivo PHP que funcionara igualmente en un servidor remoto que leyese las noticias de nuestra web.
//$ruta_fichero="http://www.dominio.com/noticias.xml";
$ruta_fichero="noticias.xml";
$contenido = "";
if($da = fopen($ruta_fichero,"r"))
{
while ($aux= fgets($da,1024))
{
$contenido.=$aux;
}
fclose($da);
}
else
{
echo "Error: no se ha podido leer el archivo <strong>$ruta_fichero</strong>";
}
Si todo ha ido correctamente ahora tendremos nuestro fichero XML cargado en nuestra variable $contenidoAhora un detalla, debido a que nuestras notícias podrían tener caracteres especiales, para evitar fallos le meteremos un pequeño filtro, que en este caso por ejemplo vamos a sustituir las tíldes y las eñes en el caso de que las hubiesen, para ello utilizaremos la función ereg_replace.
$contenido=ereg_replace("á","a",$contenido);
$contenido=ereg_replace("é","e",$contenido);
$contenido=ereg_replace("í","i",$contenido);
$contenido=ereg_replace("ó","o",$contenido);
$contenido=ereg_replace("ú","u",$contenido);
$contenido=ereg_replace("Á","A",$contenido);
$contenido=ereg_replace("É","E",$contenido);
$contenido=ereg_replace("Í","I",$contenido);
$contenido=ereg_replace("Ó","O",$contenido);
$contenido=ereg_replace("Ú","U",$contenido);
$contenido=ereg_replace("Ñ","NI",$contenido);
$contenido=ereg_replace("ñ","ni",$contenido);
El siguiente paso es cargar nuestro archivo XML en una estructura que podamos trabajar con PHP de forma comoda, para esta tarea vamos a utilizar las funciones dom que vienen implementadas a partir de la versión 4 de PHP. Concretamente usaremos:
- domxml_open_mem : Crea un objeto DOM desde un documento XML
- document_element : Crear un nuevo nodo de tipo elemento
- get_elements_by_tagname: Obtiene elementos por el nombre de etiqueta
- get_content : Obtiene el contenido del nodo
$tagnames = array ("titulo","autor","cuerpo");
if (!$xml = domxml_open_mem($contenido))
{
echo "Ha ocurrido un error al procesar el documento<strong> \"$ruta_fichero\"</strong> a XML <br>";
exit;
}
else
{
$raiz = $xml->document_element();
$tam=sizeof($tagnames);
for($i=0; $i<$tam; $i++)
{
$nodo = $raiz->get_elements_by_tagname($tagnames[$i]);
$j=0;
foreach ($nodo as $etiqueta)
{
$matriz[$j][$tagnames[$i]]=$etiqueta->get_content();
$j++;
}
}
Analicemos más detenidamente este último trozo de código a ver que es lo que realmente hace. Para empezar hemos creado un array con los campos que contiene cada noticia en la variable "tagnames". A continuación cargamos la variable contenido en un objeto DOM, en el caso de que todo haya ido bien extraemos el nodo raiz, en nuetro caso "bloque". El siguiente paso es calcular el numero de campos que obtendremos de cada noticia, para ello utilizamos la función
sizeof que nos devuelve el tamaño del array.
Es ahora cuando extraemos la verdadera información del documento XML. Esta información la vamos a introducir en una matriz para que nos sea más simple trabajar con los datos. De forma que matriz quedase algo así:
| indice \ Nombre Columna | titulo | autor | cuerpo |
| 0 | Hola Caracola | KaoS | Olla Kaitos a Luisete |
| 1 | Nuevo articulo en desarrolloweb | Raul | Jeje hola, aqui estamos |
El primer bucle extrae las etiquetas de los nodos (primero titulo, despues autor y luego cuerpo).
El foreach se encarga de sacar una a una las etiquetas de cada una de las noticias, por lo que primero extrae "Hola Caracola" y en la segunda iteración "Nuevo articulo en desarrolloweb". De este modo vamos guardando en nuestra matriz los datos extraidos.
En la segunda iteración(repetición) del bucle for cogeremos la etiqueta autor, y en el foreach extraeremos los valores para introducirlos en nuetra matriz. Y así hasta terminar. ¡Lo mejor de todo es que de esto se encarga nuestro propio bucle!, nosotros solo tendremos que preocuparlos de declarar el array de etiquetas.
Bueno para que nos sea más comodo podemos crear una función a la que le pasaremos el archivo XML que queremos que nos lea y nos devuelva una matriz con los datos, haciendo así nuestro trabajo más limpio y eficiente. El código resultante sería:
function CargarXML($ruta_fichero)
{
$contenido = "";
if($da = fopen($ruta_fichero,"r"))
{
while ($aux= fgets($da,1024))
{
$contenido.=$aux;
}
fclose($da);
}
else
{
echo "Error: no se ha podido leer el archivo <strong>$ruta_fichero</strong>";
}
$contenido=ereg_replace("á","a",$contenido);
$contenido=ereg_replace("é","e",$contenido);
$contenido=ereg_replace("í","i",$contenido);
$contenido=ereg_replace("ó","o",$contenido);
$contenido=ereg_replace("ú","u",$contenido);
$contenido=ereg_replace("Á","A",$contenido);
$contenido=ereg_replace("É","E",$contenido);
$contenido=ereg_replace("Í","I",$contenido);
$contenido=ereg_replace("Ó","O",$contenido);
$contenido=ereg_replace("Ú","U",$contenido);
$contenido=ereg_replace("Ñ","NI",$contenido);
$contenido=ereg_replace("ñ","ni",$contenido);
$tagnames = array ("titulo","autor","cuerpo");
if (!$xml = domxml_open_mem($contenido))
{
echo "Ha ocurrido un error al procesar el documento<strong> \"$ruta_fichero\"</strong> a XML <br>";
exit;
}
else
{
$raiz = $xml->document_element();
$tam=sizeof($tagnames);
for($i=0; $i<$tam; $i++)
{
$nodo = $raiz->get_elements_by_tagname($tagnames[$i]);
$j=0;
foreach ($nodo as $etiqueta)
{
$matriz[$j][$tagnames[$i]]=$etiqueta->get_content();
$j++;
}
}
return $matriz;
}
}
Bueno, pues esto ya está casi todo listo, ya hemos cargado una matriz con el contenido de un archivo XML, por lo que ahora solo nos queda mostrar la información que queramos. Vamos a ver en un pequeño código como hacerlo.
$matriz=CargarXML("noticias.xml");
$num_noticias=sizeof($matriz);
for($i=0;$i<$num_noticias;$i++)
{
echo '
<table border=1>
<tr><td align=center>'.$matriz[$i]["titulo"].'</td></tr>
<tr><td>'.$matriz[$i]["cuerpo"].'</td></tr>
<tr><td align=right >'.$matriz[$i]["autor"].'</td></tr>
</table><br>
';
}
Voilà, ya tenemos nuestro primer ejemplo de XML+PHP. Aquí podeis ver el ejemplo funcionando:
archivo xml y archivo xml formateado.
Bueno esto ha sido todo por hoy, espero que os haya sido de utilidad el artículo.
Seguir navegando a partir aquí:
+ 1 manual relacionado
+ 2 categorias relacionadas
+ 7 comentarios (Añadir)
+ 15 comentarios no revisados
| Autoría, licencia y acciones sobre este artículo |
|
|
Manuales relacionados con este artículo
Categorias relacionadas
A través de las categorías de nuestro directorio se pueden encontrar otro tipo de recursos relacionados con este artículo:
+ Entrar en
XML+ Entrar en
Scripts en PHP
Comentarios de los visitantes
|
Los comentarios de los visitantes son para ampliar la información del artículo. Cualquiera puede participar.
|
| Se muestran 7 comentarios revisados |
Comentario de Guillermo
06/6/06
sino me equivoco el script anterior parace ser un poco seguro ya que se prodria incluir un archivo creado especialemente para el return $matris devuelva codigos PHP. Saludos.
Comentario de Carlos
06/6/06
Hay una manera bastante más eficaz de reemplazar las letras acentuadas, y otros caracteres. Se trata de codificar primero estas letras a caracteres especiales HTML ("á", "ñ", etc.), y entonces crear un patrón que busque la "&" como inicio, el ";" como final, y elimine todo lo que no sea el segundo carácter de la expresión. No incluyo aquí el listado pero con PHP es muy fácil.
Comentario de Marcos
15/6/06
No hay que olvidar habilitar en el archivo de inicio (PHP.INI) la biblioteca adecuada para el el manejo de XML, ya que por defecto NO esta habilitada. Esto se hace buscando en el PHP.INI, la linea "extension=php_domxml.dll"
y quitarle el puntoy coma.
Saludos
Comentario de Salvador
08/7/06
En el ejemplo creo que es más aconsejable utilizar
domxml_open_file
para leer un fichero xml
Más información sobre domxml_open_file
http://es2.php.net/manual/es/function.domxml-open-file.php
Comentario de Martin
09/8/06
Excelente artículo!
Un detalle. Para imprimir $matriz en algunos casos es conveniente hacerlo con utf8_decode . Al menos con el xml que he tenido que leer yo.
Saludos!
Comentario de JaviBL
28/12/06
Para solucionar el problema de las tildes y carácteres extraños.
- Tenemos que GUARDAR nuestro archivo xml a UTF-8 (con el mismo block de notas se puede hacer).
- Le ponemos la siguiente cabecera al XMl
<?xml version="1.0" encoding="UTF-8"?>
- En el archivo PHP, en el que vamos a mostrar los valores del XML escribimos
echo (utf8_decode($matriz[$i]["descripcion"]));
para decodificar el texto de las etiquetas del XML.
Un saludo
Para el error de Allow url fopen. Yo tengo hosting en DreamHost y ellos no permiten abrir archivos externos. Existe un tutorial para resolverlo.
Les paso el link:
http://wiki.dreamhost.com/index.php/Allow_url_fopen
Y lo del DOMXML tenes que configurarlo desde php.ini. Yo lo hice asi y ahora anda de maravella.
| Comentarios sin revisar |
|
Entre los comentarios no revisados puede haber algunos interesantes que se hayan enviado recientemente.
|
Se han encontrado 15 comentarios sin revisar
Ir arriba