Leer XML con PHP (II)

Facebooktwittergoogle_pluslinkedinmailFacebooktwittergoogle_pluslinkedinmail

En el artículo anterior aprendimos cómo podemos leer un XML para procesar sus datos en PHP. Resumiendo lo que vimos partimos de lo siguiente:

  • Ha quedado claro que necesitamos conocer la estructura del XML que nos llega, para poder procesarlo adecuadamente.
  • El proceso básico es siempre el mismo: leer los elementos y atributos de los nodos.
  • El mismo proceso se repite, dependiendo de la estructura de anidamiento de nodos y sub-nodos. Cuanto más complejo sea el XML, más lecturas deberemos hacer para recuperar todos sus datos.

En la mayoría de los casos, cuando nos llega un XML para procesar con PHP es parte de un proceso para intercambio de datos entre dos plataformas web diferentes (lo que, por supuesto, es la razón de ser de los formatos de intercambio de datos, como es XML). Eso quiere decir que el proceso que haya creado el XML habrá generado, en la mayoría de los casos, un XML, digámoslo así: simple, es decir, sin nada más que el propio XML con su estructura de nodos, elementos y atributos.

NAMESPACES

A pesar de o comentado, en aplicaciones que lean fuentes similares de varios orígenes es posible que el archivo XML incluya el uso de espacios de nombres. Una cosa que vamos a aprender es a leer los namespaces de un XML, si los tiene. Para ello vamos a partir del XML que hemos empleado en esta serie de artículos, levemente modificado. Lo hemos llamado obras_NS.xml:

ATENCIÓN. Las URI que figuran como xmlns sólo incluyen, llegado el caso, información legible para lectores humanos. En ningun caso son procesadas por el analizador XML.

La matriz de resultados que queremos obtener es la siguiente (seguro que ya te suena familiar):

Vamos  a comentar un par de detalles antes de listar el código que nos permite leer este archivo.

Observa, en el XML, que el nodo obras (que es el nodo raíz) y cada uno de los nodos obra tienen el mismo espacio de nombres (ns_obras_origen_1). A los efectos, cómo el nodo raíz sólo tiene los sob-nodos obra (no tiene atributos ni elemento) solo nos interesa el espacio de nombres desde el punto de vista de cada nodo obra.

Con el personal técnico la cosa es diferente. Tanto el nodo personal_tecnico como sus sub-nodos miembro comparten el espacio de nombres ns_personal_origen_1. Dado que, cuando utilizamos espacios de nombres los nodos son identificados a través de estos, tendremos que tenerlo en cuenta al leer los datos de cada miembro del personal técnico, así como su correspondiente atributo. En seguida lo veremos. El código, que hemos llamado leer_NS.php, es el siguiente:

Aunque el código es muy similar al del artículo anterior, el uso de namespaces nos obliga a retocar algunos detalles. En primer lugar, debemos obtener una matriz con los espacios de nombres que se han encontrado en el XML, así:

$espaciosDeNombres = $contenidoXML->getNamespaces(true);

El parámetro true hace que se busquen, recursivamente, todos los espacios de nombres, de modo que no se “salte” ninguno por estar anidado dentro de otro.

Los nodos obra son identificados a través de su espacio de nombres, así:

$nodos_NS_Obra = $contenidoXML->children($espaciosDeNombres['ns_obras_origen_1']);

Por lo tanto, para recorrer cada uno, cambiamos un poco el bucle, así:

foreach ($nodos_NS_Obra as $obra) {

De hacerlo cómo en el ejercicio del artículo anterior, no se encontrarían los nodos obra, porque el espacio de nombres los encapsula, ocultándolos a la lectura “normal”.

Dentro de cada nodo obra, los nodos del personal técnico también deben ser identificados por su espacio de nombres, así:

$nodos_NS_personal = $obra->children($espaciosDeNombres['ns_personal_origen_1']);

Cómo el espacio de nombres aquí encapsula al nodo personal_tecnico y a sus sub-nodos miembro, para acceder a cada miembro individual debemos recorrer el nodo personal_tecnico, que es el primero del espacio de nombres, por lo que debemos emplear su índice (que es el [0]), así:

foreach ($nodos_NS_personal[0] as $directivo){

EN CONCLUSIÓN

Cómo ves, el uso de espacios de nombres permite una mayor encapsulación de los datos, a costa de un poco más de complejidad en el código pero, si a tu aplicación le llega un XML con espacios de nombres, deberás tenerlo en cuenta.

     

Un comentario:

  1. Pingback: Leer XML con PHP (I) » eldesvandejose.com

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *