Como todos sabemos, desde que apareció el formato JSON creado por Douglas Crockford en el año 2002, el lenguaje de marcas extensible XML  (por sus siglas en ingles eXtensive Markup Language) tiene sus días contados.

Personalmente cuando tuve que mudar de XML a JSON odie a este ultimo un poco, pero con el tiempo he aprendido que volver al viejo XML seria realmente doloroso, ya que es difícil de leer, y las estructuras de datos que encierra no son tan obvias como en JSON.

No obstante aun me encuentro, durante mis proyectos de freelancero, con sistemas complejos que aun usan XML para intercambiar datos entre servicios. Y me pregunte ¿Quien diablos usa esto, hoy en día? y decidí hacer este post que muestra como manejar este arcano lenguaje utilizando php.

Vamos a imaginarnos que tenemos una respuesta xml de un servidor que devuelve algo asi:

<?xml version="1.0"?>
<numbers>
   <num>1</num>
   <num>2</num>
   <num>3</num>
   <num>4</num>
   <num>5</num>
   <num>6</num>
   <num>7</num>
   <num>8</num>
   <num>9</num>
   <num>10</num>
</numbers>

Ahora bien, para manejar esta estructura debemos crear un parser xml. Afortunadamente para nosotros este soporte es nativo de php y no necesitamos ninguna aplicación de terceros.

Entonces manos al código:

//creamos el parser
$xmlString = file_get_contents($xmlArchivo);
$xml = new SimpleXMLElement($xmlString);

Esto automáticamente envuelve el xml en una estructura de datos que se puede usar de inmediato y tiene la siguiente forma:

SimpleXMLElement Object
(
    [num] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
            [3] => 4
            [4] => 5
            [5] => 6
            [6] => 7
            [7] => 8
            [8] => 9
            [9] => 10
        )

)

Note que tenemos un array simple de numeros, que puede ser accedido asi:

$numeros = $xml->num;

Y recorrido así:

foreach($numeros as $numero) {
    echo $numero;
}

La cosa se pone interesante cuando vienen elementos anidados en el xml, veamos el caso:

<?xml version='1.0'?>
   <numbers>
      <num>1</num>
      <num>2</num>
      <num>3</num>
      <num>4</num>
      <num>5</num>
      <num>6</num>
      <num>7</num>
      <num>8</num>
      <num>9</num>
      <num>10</num>
      <names>
         <name>Juan</name>
         <name>Pedro</name>
         <name>Maria</name>
         <name>Olivia</name>
      </names>
   </numbers>

al pasar eso por el código de arriba, el resultado seria un objeto así:

SimpleXMLElement Object
(
    [num] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
            [3] => 4
            [4] => 5
            [5] => 6
            [6] => 7
            [7] => 8
            [8] => 9
            [9] => 10
        )

    [names] => SimpleXMLElement Object
        (
            [name] => Array
                (
                    [0] => Juan
                    [1] => Pedro
                    [2] => Maria
                    [3] => Olivia
                )

        )

)

Para leer este nuevo objeto anidado se tendría que leer así:

$nombres = $xml->names->name;

Ahora esto se torna poco intuitivo, porque “name” aquí es realmente un arreglo de cosas que se puede recorrer, confunde al estar en singular. Pero la logica correcta para leerlo seria mas o menos asi: “el objeto xml contiene un objeto names que tiene una colección de name“.

Y así es como php se va convirtiendo lentamente en un infierno difícil de entender cuando usamos tecnología del pasado, no obstante al usar json en lugar de php la cosa pinta mejor, ya que tendriamos un json asi:

{
        "numbers": [0,1,2,3,4,5,6,7,8,9],
        "names": ["Juan", "Pedro", "Maria", "Oliva"]
    }

ven como todo es mas claro así? y si queremos volverlo un objeto nativo de php solo tenemos que hacer lo siguiente:

$json = json_decode($entry, true);

Lo cual nos dara un objeto mucho mas facil de entender:

Array
(
    [numbers] => Array
        (
            [0] => 0
            [1] => 1
            [2] => 2
            [3] => 3
            [4] => 4
            [5] => 5
            [6] => 6
            [7] => 7
            [8] => 8
            [9] => 9
        )

    [names] => Array
        (
            [0] => Juan
            [1] => Pedro
            [2] => Maria
            [3] => Oliva
        )

)

Ven que simple? 1 arreglo con 2 arreglos anidados que, para variar, tienen su nombre en plural.

Conclusión

En el post se muestra como manejar input en formato xml y convertirlo a objetos php. En general el desarrollador debería mover todas sus respuestas al nuevo y mejorado formato json. Pero si la circunstancias te obligan no esta mal usar la solución que php ofrece de forma nativa.

Categorized in:

Tagged in:

, , ,