Parsear un archivo XML con PHP y DOM.XML
Escrito por Alex Barros Brevemente voy a introducir el uso de la extensión DOM.XML de PHP
Podemos leer un archivo XML a partir de una cadena de texto (con domxml_open_mem) o diciendo dónde está el archivo XML ( con domxml_open_file)

Como ejemplo usaremos el archivo XML que proporciona el API Google Weather (no documentada) para hacer predicciones meteorológicas en determinado lugar.
-
$xml = domxml_open_file(‘http://www.google.com/ig/api?hl=es&weather=Madrid’); //En este caso la prediccion para madrid
El método más importante es get_elements_by_tagname, que nos devuelve los tags que tienen ese nombre, en forma de array.
En nuestro caso, vamos a hacer una comprobación por si el documento XML nos informa de que ha habido un error, con el tag problem_cause ver ejemplo
-
$problem = $xml->get_elements_by_tagname(‘problem_cause’);
-
if($problem) {
-
$problem_cause = $problem[0]->get_attribute_node(‘data’);
-
} else {
-
…
-
}
Para obtener la descripción, tendremos que usar el método get_attribute_node que nos dice el valor del atributo que queramos, para un elemento [nombreTag atributo="valor"].
Y ahora, vamos a ir directos al ajo. Echad un vistazo a la estructura del API Google Weather, y al siguiente código, después lo explico.
-
//Esta funcion nos ayuda a sacar el atributo "data" del "tag" de un nodo dado
-
function getTagDataFromNode($tag,$node){
-
$child = $node->get_elements_by_tagname($tag);
-
$data = $child[0]->get_attribute_node(‘data’);
-
return $data->value();
-
}
-
-
//Extraigo la informacion de la prediccion
-
$infoTag = $xml->get_elements_by_tagname(‘forecast_information’);
-
$city = getTagDataFromNode(‘city’,$infoTag[0]); //La ciudad
-
$date = getTagDataFromNode(‘forecast_date’,$infoTag[0]); //La fecha de la prediccion
-
-
echo "<h1>Prediccion en $city ($date)</h1>";
-
-
//Prediccion para los proximos dias
-
$items = $xml->get_elements_by_tagname(‘forecast_conditions’);
-
-
foreach($items as $item){
-
echo "<img src=\"http://google.com".getTagDataFromNode(‘icon’,$item)."\"><br>".getTagDataFromNode(‘condition’,$item).".<br>";
-
echo "Temperaturas entre ".getTagDataFromNode(‘low’,$item)." °C y ".getTagDataFromNode(‘high’,$item)." °C</p>";
-
}
La función que se define al comienzo sirve para ahorrarnos código al extraer el atributo “data” de los nodos, porque todos los tags tienen lo importante ahí.
El resto del código creo que está bastante claro. Puedes ver una [Demo] y el [código fuente].
Si te ha gustado el post, te parece interesante, o tienes dudas escríbeme un comentario, tengo ganas de leerte!
Nota: Si no tienes esta extensión instalada en tu host, pregunta al servicio técnico para que te lo instalen, o mira esta página para hacerlo tú mismo.
Categorias: Aplicaciones, Código, PHP |



Respeta el copyleft
Agosto
19:07 Vengador Ha dicho:
Juas!! Con esa ultima frase parece que te pone cachondo que te dejemos comentarios XDDD
Agosto
19:46 Alex Barros Ha dicho:
Pues.. no lo desmiento…
Esque desde junio, que paramos por exámenes, apenas comenta la gente, y es más divertido cuando la gente dice lo que piensa.
También está el factor comentariofílico, pero eso entra en mi vida privada… u_u
Agosto
21:48 Antonio Ha dicho:
Me ha gustado mucho el artículo, me parece interesante y bien elaborado. Así que aquí va un comentario.
Un saludo.
Agosto
22:14 Alex Barros Ha dicho:
Muchas gracias, Antonio!
Te debo un comentario
para asegurarme, me agrego tu blog.
Nos vemos!
Agosto
1:32 Angelfire Ha dicho:
Gracias Alex, es más fácil leer la manera de instalar en español
http://es.php.net/manual/es/domxml.installation.php
Agosto
1:46 Angelfire Ha dicho:
Disculpa por el doble post, pero al parecer el paquete ha dejado de ser mantenido, para linux ya no existe, en el site de descarga aparece lo siguiente:
Agosto
3:07 Alex Barros Ha dicho:
Muchas gracias por el aviso, Angelfire. Exploraré esta nueva forma mantenida por PHP.. en la informática es renovarse o morir!
Por cierto, tengo que editar el theme porque ya no sale el gravatar… la semana que viene cuando vuelva de mi viaje me encargo!
Agosto
3:33 Emiliano Ha dicho:
Hola Alex,
Muchas gracias por tu artículo, me vino bien a mano ya que era exactamente lo que estaba intentando hacer.
Pude desarrollarlo utilizando otra clase llamada DOMDocument que es nativa de php, que es similar a la que usaste.
Otra cosa que cabe la pena destacar es que tuve problemas al hace la llamada DOMDocumente->load en mi servidor compartido ya que no permiten este tipo de llamadas (el flag allow_url_fopen se encuentra en off y no tengo forma de acceder al archivo php.ini). Así que recurrí cURL.
Ah, por último… tuve un par de problemitas cuando en el xml de respuesta me llegaban caracteres codificados en utf-8. Por alguna razón google no especifica en la cabecera del xml el encoding del mismo y el método load fallaba… te pasó algo similar??
Bueno, linda página.
Suerte!
Agosto
8:48 Alex Barros Ha dicho:
Muchas gracias por tus contribuciones, Emiliano.
Sí que me ocurre el problema de UTF-8, basta con usar la función utf8_decode()
Un saludo
Septiembre
21:51 Carlos Saez Ha dicho:
Hola,
Gracias por la info. Yo estoy utilizando una vesión anterior a php5 y tengo algunas complicaciones, pero que más o menos voy resolviendo.
Tan solo tengo una duda, a ver si me la puedes responder. A la hora de transformar este xml con php, los [0] ["#"] ["@"], etc, ¿qué significan?
Gracias de antemano!
Septiembre
22:22 Alex Barros Ha dicho:
Lo siento Carlos, no entiendo a qué te refieres con los símbolos. Si puedes ser más preciso, trataré de averiguar qué significan y explicártelo.
Un saludo
Septiembre
22:41 Carlos Saez Ha dicho:
Hola Alex,
Gracias por tu respuesta.
Mira te comento. Hice un parser que funciona perfectamente, pero con escasas nociones y cogiendo de aquí y de allá. En este parser utilizo los símbolos:
//damos nombre al evento y cogemos la fecha
$ligas = $xml["leaguelist"]["#"]["league"];
También más abajo utilizo:
$name_liga = $liga["@"]["name"];
Y también he llegado a ver un [0] en algunas ocasiones, pero yo no lo he utilizado.
Me gustaría saber bien bien qué es lo que estoy haciendo para aprenderlo perfectamente, y es que no llego a identificar el qué significan esos símbolos ["#"], ["@"], etcétera… También porque ahora estoy parseando otros xml de estructura similar, y no lo estoy haciendo bien porque creo que no estoy utilizando bien estos caracteres.
GRacias, saludos.
Septiembre
0:30 Alex Barros Ha dicho:
En PHP, cuando usas una variable seguida de unos corchetes, significa que estás accediendo a un elemento de esa cadena (se deduce que la cadena es una matriz)
La matriz puede tener índices numerales $var[0] $var[1] … o claves alfanuméricas $var['abc'] $var['&']
La cuestión es que usando el parseador que tú usas, te devuelbe el contenido, estructurado en una matriz, con esas claves. Lo que no se es qué están queriendo decir con # o con @
Si me dices la función que has usado para generar las variables como $ligas o $name_liga podré investigar un poco qué indican los signos.
Un saludo