Extraer contenido y datos de un XML con PHP
Actualizado: 17 de noviembre del 2022
Por: Norfi Carrodeguas
Por: Norfi Carrodeguas
Leer la información o valores de las etiquetas de un feed, un KML de Google Earth o cualquier otro archivo en formato XML, usando simplexml.
En otro artículo Extraer y convertir el contenido de un RSS a HTML, explico cómo publicar en una página el contenido de un feed de noticias de cualquier sitio web.
En este comparto varios ejemplos de cómo hacerlo en archivos FEED con formatos más complejos y con los archivos KML que genera Google Earth.
Renderizar o parsear XML con PHP, ejemplos
Información en los archivos RSS en formato XML
Hay mucha variedad en el formato empleado en los archivos RSS, usados como feeds de noticias, en los sitios de internet.Generalmente estos archivos proveen en cada item información a los lectores sobre los siguientes parámetros: título, Url de la página, Url de la imagen, descripción y fecha y hora.
Para eso los datos se proporcionan como valores en diferentes etiquetas.
Las que casi nunca cambian son title (titulo), link (URL de la página), description (descripción) y pubDate (fecha y hora).
El resto de los campos, principalmente la dirección URL de la imagen que representa la página, varía mucho, como se puede ver en los siguientes ejemplos.
Extraer con PHP datos de un feed RSS
El primer ejemplo es el mas elemental.Los datos a extraer se proporcionan en el feed RSS usando el siguiente formato:
<rss>
<channel>
<item>
<title>Titulo del item</title>
<link>http://url-pagina</link>
<description>Descripcion</description>
<pubDate>Fecha y hora</pubDate>
</item>
</channel>
</rss>
Para extraer los datos de cada etiqueta, solo necesitamos usar PHP de la siguiente forma:<?php
function feed($feedURL){
$i = 0; $url = $feedURL;
$rss = simplexml_load_file($url);
foreach($rss->channel->item as $item) {
$link = $item->link; //extraer el link
$title = $item->title; //extraer el titulo
$date = $item->pubDate; //extraer la fecha y hora
$description = strip_tags($item->description); //extraer descripcion y recortarla
if (strlen($description) > 400) {
$stringCut = substr($description, 0, 200);
$description = substr($stringCut, 0, strrpos($stringCut, ' ')).'...';}
if ($i < 1) {
echo '<a href="'.$link.'" target="_blank">'.$title.'</a>'.$description.'<div>'.$date.'</div>';
}
$i++;
}
}
?>
<?php feed("archivo.rss") ?>
Extraer direcciones URL de las imágenes
RSS 2.0 permite que se proporcione la dirección URL de la imagen representativa de la página, usando la etiqueta "enclosure" de la siguiente forma:<enclosure url="http://url-imagen.jpg">
De la siguiente forma podemos extraer con PHP el valor de la dirección en el archivo XML:$url_imagen = $item->enclosure['url'];
Este método es el que uso para representar en la página de este sitio Las fotos astronómicas más recientes de la NASA y ESA, la información que ofrece NASA Image of the Day, en el feed RSS que provee este servicio.Otros formatos usados (media:thumbnail)
En algunos casos la dirección URL de la imagen que representa a la página, se proporciona de la siguiente forma.<media:thumbnail url="http://url-imagen.jpg"></media:thumbnail>
En ese caso necesitamos extraer la información como en el siguiente ejemplo.<?php
if(is_array(($item->xpath('media:thumbnail')))){
$mediaArray = $item->xpath('media:thumbnail');
$media = end($mediaArray);
$url_imagen = $media->attributes()->url;
}
?>
Este método es el que uso para representar en la página mencionada de este sitio, la información que ofrece NASA Earth Observatory Image of the Day, en el feed RSS que provee este servicio.Elemento IMG dentro de la etiqueta description
Hay casos en los que la dirección URL de la imagen se proporciona dentro de la etiqueta "description", agregando un elemento IMG de la siguiente forma.<description><![CDATA[<img src="http://url-imagen.jpg" alt="" /><p>Descripción del item</p>]]></description>
En esos casos solo se necesita extraer los datos de dicha etiqueta.$url_imagen = $item->description;
Extraer coordenadas de una Ruta de Google Earth en archivo KML
Al crear una ruta en Google Earth, formada por una sucesión de puntos, cada uno con sus coordenadas (longitud y latitud), se puede guardar como un archivo KML.La serie de coordenadas se guardan dentro de una etiqueta "coordinates" usando una estructura similar a la siguiente:
<Document>
<Placemark>
<LineString>
<coordinates>
-82.12470535178659,23.15194791193536,0 -82.12337724207117,23.15281011040597,0 ...
</coordinates>
</LineString>
</Placemark>
</Document>
Para extraerlas de un archivo de nombre "Ruta.kml", usa el siguiente código:<?php
function feed($feedURL){
$i = 0; $url = $feedURL;
$rss = simplexml_load_file($url);
foreach($rss->Document->Placemark as $item) {
$coordinates = $item->LineString->coordinates;
if ($i < 100) { // parse hasta 100 items
$test=explode(" ",$coordinates);
for( $i = 0 ; $i <= 300 ; $i++ ) {
echo '['.$test[$i].'],<br>';
}
}
$i++;
}}
?>
<?php feed("Ruta.kml") ?>
El resultado sera similar al siguiente:[-82.12470535178659,23.15194791193536,0],
[-82.12337724207117,23.15281011040597,0]
Este método es el que uso para extraer las coordenadas de un KML creado con Google Earth, para representar en la página de este sitio: El Tren Eléctrico de Hershey en Cuba, un mapa con el recorrido de dicho tren y los otros ramales existentes.
Extraer coordenadas de puntos de lugares en un KML
Al marcar diferentes lugares en Google Earth usando puntos y guardarlos en un KML, podemos posteriormente extraer las coordenadas y el nombre de cada punto.En el KML dicha información se guarda usando un formato similar al siguiente:
<Placemark>
<name>Nombre del punto</name>
<Point>
<coordinates>-81.94231945397482,23.12721107393359,0</coordinates>
</Point>
</Placemark>
Para extraerlas de un archivo de nombre "puntos.kml", usa el siguiente código:<?php
function feed($feedURL){
$i = 0; $url = $feedURL;
$rss = simplexml_load_file($url);
foreach($rss->Document->Folder->Placemark as $item) {
$name = $item->name; //extraer nombres
$coordinates = $item->Point->coordinates; //extract (lon, lat y zoom)
if ($i < 100) {
//Separa los tres parametros en las coordenadas (lon, lat y zoom) y escribe los dos primeros en el orden: (lat,lon)
$test=explode(",",$coordinates);
echo '['.$test[1].','.$test[0].'], //'.$name.'<br>';
}
$i++;
}}
?>
<?php feed("puntos.kml") ?>
El resultado en este caso sera similar al siguiente:[23.12721107393359,-81.94231945397482], //Nombre del punto
Páginas relacionadas
✔ Como escribir con PHP en las páginas web
✔ Insertar contenido de otra página con AJAX, JavaScript y JQuery
✔ Ejemplos prácticos, trucos y demostraciones de PHP
✔ Crear, comprimir o convertir archivos PDF gratis
✔ Insertar contenido de otra página con AJAX, JavaScript y JQuery
✔ Ejemplos prácticos, trucos y demostraciones de PHP
✔ Crear, comprimir o convertir archivos PDF gratis
Comparte
Facebook
Twitter