Leer archivo XML en PHP | Ejemplos prácticos

En este artículo vamos a ver como podemos leer un documento XML y obtener el contenido de dicho documento mediante el lenguaje de programación PHP.

El objetivo del ejercicio es leer la información que nos proporciona el XML y almacenarla en variables o arrays.

Después cada programador tratará la información conforme le convenga, algunos casos útiles pueden ser:

  • Migrar información de un XML a una base de datos.
  • Enviar correos de forma masiva con información del XML.
  • Volcar la información obtenida en un documento generado como PDF, TXT, CSV…
  • Realizar cambios del XML, quizás nos interese ampliar campos o agregarle nueva información.
  • Búsquedas dentro de un fichero XML.

La estructura XML donde vamos a realizar el caso práctico es la siguiente:

$xmlstr = <<<XML
  <?xml version='1.0' encoding="UTF-8"?>
    <universidades>
      <universidad tipo="pública">
        <nombre>Universidad Politécnica de Valencia</nombre>
        <localizacion>
          <ciudad>Valencia</ciudad>
        </localizacion>
        <especialidades>
	  <especialidad>Ing. Informática</especialidad>
	  <especialidad>Ing. Telecomunicaciones</especialidad>
	  <especialidad>Ing. Industrial</especialidad>
        </especialidades>
      </universidad>
    <universidad tipo="privada">
      <nombre>Universidad CEU</nombre>
      <localizacion>
        <ciudad>Valencia</ciudad>
      </localizacion>
      <especialidades>
	<especialidad>Magisterio</especialidad>
        <especialidad>ADE</especialidad>
	<especialidad>Medicina</especialidad>
      </especialidades>
    </universidad>
  </universidades>
XML;

Usaremos la función SimpleXMLElement para leer el XML.

try 
{
   //cargamos el archivo XML
   $xml = new SimpleXMLElement($xmlstr);
} 
catch (Exception $e) 
{
   //manejamos error de lectura
   echo 'XML no valido';
}

Una vez tengamos el XML cargado ya podemos leerlo.

Codificar caracteres especiales como acentos, ñ… desde un XML

Si estamos trabajando con cadenas de texto que contienen acentos, ñ… deberemos codificarlo en utf8 para que se lean correctamente, para ello cuando leamos las variables que contengan el contenido usaremos la función de PHP utf8_decode().

La forma de usarla es pasarle como parámetro el string que deseemos codificar como por ejemplo:

$nombre = utf8_decode($xml->universidad[0]->nombre);

Obtener contenido de una etiqueta:

  • Si queremos obtener el nombre de la primera universidad:
  •   echo $xml->universidad[0]->nombre;

    El resultado será: Universidad Politécnica de Valencia

  • Si queremos obtener el nombre de la segunda universidad sencillamente pondremos:
  •   echo $xml->universidad[1]->nombre;

    El resultado será: Universidad CEU

  • Si queremos obtener la ciudad donde está situada la primera universidad accederemos a dicha información de la siguiente forma:
  • echo $xml->universidad[0]->localizacion->ciudad;

    El resultado será: Valencia

    Obtener atributos de un XML con bucles:

    La información que vamos a obtener de nuestro XML va a ser el tipo de universidad (atributo de la etiqueta universidad).

    Para ello vamos a realizar un bucle que recorrerá todas las etiquetas universidad y obtendrá sus respectivos tipos.

    $v_tipos = array();
     
    //recorremos el tipo por cada universidad
    foreach ($xml->universidad as $tipo) 
    {
      //almacenamos todos los tipos de las universidades en un array
      $v_tipos [] = $tipo['tipo'];
    }

    Nuestro array $v_tipos devolverá:

    Array 
    ( 
       [0] => SimpleXMLElement Object ( [0] => pública ) 
       [1] => SimpleXMLElement Object ( [0] => privada ) 
    )

    Podemos observar que el indice 0 se corresponde con la primera universidad (Politécnica de Valencia) y el segundo indice se corresponde con la segunda (CEU).

    Obtener el contenido de etiquetas con bucles:

    Ahora vamos a obtener sus especialidades, vemos que cada universidad cuenta con tres de estas, para obtener dichas especialidades haremos un array con dos dimensiones, la primera dimensión será para indicarle la universidad a la que pertenece y la segunda dimensión será para identificar la especialidad.

    $v_Universidades = array();	
     
    //contador de las universidades disponibles
    $contUni = 0;
     
    //bucle univerdidades
    foreach ($xml->universidad as $univerdidadInfo) 
    {	
      //contador de las especialidades
      $contEspe = 0;
     
      //bucle especialidades
      foreach ($univerdidadInfo->especialidades->especialidad as $especialidadInfo) 
      {
        $v_Universidades[$contUni][$contEspe] .= $especialidadInfo;
        $contEspe++;
      }
      $contUni++;
    }

    El resultado del array $v_Universidades será:

    Array 
    ( 
      [0] => Array 
             ( 
                [0] => Ing. Informatica 
                [1] => Ing. Telecomuncaciones 
                [2] => Ing. Indrustrial 
             ) 
      [1] => Array 
             ( 
                [0] => Magisterio 
                [1] => ADE 
                [2] => Medicina 
             ) 
    )

    Modificar contenido del XML:

    Vamos a cambiar el nombre y la ciudad de la primera universidad.

    $xml->universidad[0]->localizacion->ciudad = 'Madrid';
    $xml->universidad[0]->nombre = 'Universidad Politecnica de Madrid';
     
    //El método asXML resetea el contenido del objeto padre en XML
    echo $xml->asXML();

    Agregar nuevo campo a la estructura XML:

    Ahora vamos a agregarle una nueva especialidad a nuestra universidad.

    $especialidad = $xml->universidad[0]->especialidades->addChild('especialidad');
    $especialidad->addChild('especialidad', 'Arquitectura');
    echo $xml->asXML();

    El resultado de nuestros dos últimos cambios quedaría de la siguiente manera:

    Nombre: Universidad Politécnica de Madrid
    Ciudad: Madrid
    Especialidad: Ing. Informática 
    Especialidad: Ing. Telecomunicaciones 
    Especialidad: Ing. Industrial 
    Especialidad: Arquitectura

    Iván Martínez

    Ingeniero Informático apasionado por el mundo del desarrollo WEB. Me gusta caminar por este mundo lleno de tecnologías y día a día aprender cosas nuevas como el doctor Frankenstein ¡dadme cosas para experimentar!

    Deja un comentario

    Tu dirección de correo electrónico no será publicada.