Programación y ejemplos de PHP, jQuery, HTML5, WordPress, MySQL, AMP y htaccess


PHP simpleXML: Leer y parsear los nodos, atributos y namespaces de un XML

Vamos a ver las diferentes maneras que hay para leer, parsear o recorrer un XML con las funciones de PHP simpleXML. Con dichas funciones accederemos a los diferentes nodos del XML, a los atributos y a los namespaces.

Otras 2 funciones de PHP muy útiles para trabajar con XML y su codificación son:

Espero que no se os haga espeso y largo el post, pero he intentado resumir las operaciones básicas para operar con XMLs.

¿Qué son los nodos de un XML?

Son los diferentes tags y niveles con la jerarquía de padres e hijos donde se aloja la info del XML, por ejemplo:

En este ejemplo vemos los diferentes valores que hay en los nodos hijos agrupados en un nodo padre.

¿Qué son los atributos de un XML?

Los atributos de un xml se encuentran dentro de la declaración de un nodo, por ejemplo:

Podéis ver en cada nodo hijo el atributo.

¿Qué son los namespaces de un XML?

Son prefijos que se declaran en cada nodo del XML, por ejemplo:

Ahí tenemos el namespace ‘v’ que sirve para referenciar vehículos y a su vez su marca y modelo.

Funciones imprescindibles para leer y parsear los nodos, atributos y namespaces de un XML

Las diferentes funciones de PHP simpleXML que vamos a ver son:

  • simplexml_load_file(): Carga un XML físico en un ojeto.
  • simplexml_load_string(): Carga la estructura de un XML alamacenada en una variable en un objeto.
  • Con PHP foreach() recorreremos los xml.
  • Con PHP count() obtendremos el número de nodos.
  • La funicón attributes() de PHP simpleXML nos permite acceder a los valores de los atributos de un XML.
  • Para sacar la información de los nodos con namespaces usaremos la función getNamespaces().

Para realizar este post he extraído información de la web oficial de simpleXML.

Sintaxis y ejemplo de la función simplexml_load_file()

La función simplexml_load_file() carga un fichero XML en un objeto, es decir, el XML se carga en una variable. Su sintaxis es la siguiente:

Os lo explico:

  • $ruta_xml (Obligatorio): En esta variable debemos pasar la ruta del XML que queremos cargar.
  • $clase (Opcional): Especifica la clase del objeto donde se carga el XML.
  • $opciones (Opcional): Configuración de los parámetros adicionales de la librería libxml, más info aquí.
  • $ns (Opcional): Valor para especificar un namespace o URI.
  • $prefijo (Opcional): TRUE si es namespace y FALSE si es URI.

Quizás nunca uséis los parámetros opcionales, ahora os pongo un código de ejemplo básico para la mayoría de los casos:

Sintaxis y ejemplo de la función simplexml_load_string()

La función simplexml_load_string() es similar por no decir idéntica que simplexml_load_file(), esta nueva función carga la estructura XML almacenada en una variable dentro de un objeto.

La sintaxis y parámetros como ya he dicho son idénticos:

Un ejemplo de llamada sería así:

Ejemplo para parsear, leer o acceder a un nodo de un XML

Con los anteriores códigos y ejemplos hemos visto cómo cargar un XML en un objeto, este objeto creado es muy parecido a un array asociativo. He preparado este primer ejemplo con un XML con esta estructura:

El código PHP para acceder a un nodo (primer valor) es el siguiente:

Os explico:

  • En la primera línea cargamos el XML con la función simple_load_file() en la variable $xml.
  • En la segunda accedemos al valor del nodo hijo. No hace falta mencionar el nodo padre ($xml->nodo_padre->nodo_hijo), solo hay que seguir la jerarquía de nodos a partir de los nodos hijos: nodo_hijo1->nodo_hijo2->nodo_hijo3 … etc…

Ejemplo para recorrer los nodos de un XML

En el primer ejemplo hemos podido acceder al primer valor de un XML, ahora vamos a ver cómo recorrer o parsear todos los nodos de un XML.

En este segundo ejemplo también vamos a acceder a un 3º nivel de nodos para que veáis cómo se accede a nodos interiores. La estructura del XML es la siguiente:

El código PHP es el siguiente:

Y ahora explico el código:

  • En la primera línea cargamos el XML en la variable $xml.
  • Después en la 2º línea usamos la función PHP foreach para recorrer los nodos.
  • Recorremos los nodos con nombre ‘nodo_hijo’ cargados en la variable $xml y los cargamos en la variable $nodo.
  • Y terminamos sacando la información del nodo ‘valor’ de la variable $nodo.

Si queremos acceder a un nodo concreto el código sería el siguiente (por ejemplo al nodo 2):

El índice de los nodos comienza por el número 0, siendo el nodo 2 el índice número 1.

Obtener el número de nodos de un XML con PHP count()

Nuevo ejemplo para obtener de una manera sencilla el número de nodos de un XML. La estructura del XML es la siguiente:

Con este código vamos a sacar el número de ‘nodos_hijos’:

Explico el código:

  • Se carga el XML con la función de PHP simpleXML simplexml_load_file().
  • Con la función de PHP count() sacamos el número de ‘nodo_hijo’, subnodos ‘valor’ del nodo ‘nodo_hijo’ y el número de nodos ‘valor’ del 2º nodo ‘nodo_hijo’.

Si necesitamos automatizar el recuento de nodos… He preparado este código para contar el número de nodos ‘valor’ dentro de los nodos ‘nodo_hijo’.

Podéis verlo funcionando en la misma url del ejemplo anterior.

Sintaxis de la función attributes() de PHP simpleXML

Os pongo su sintaxis:

Explico las variables:

  • $ns (Opcional): Valor para especificar un namespace o URI.
  • $prefijo (Opcional): TRUE si es namespace y FALSE si es URI.

Obtener los valores de los atributos de los nodos de un XML con la función attributes()

Para ver en funcionamiento la función anterior he realizado este nuevo ejemplo con un XML con la siguiente estructura.

El código PHP sería el siguiente:

La explicación es sencilla:

  • Se carga el XML con la función de PHP simpleXML simplexml_load_file().
  • Recorremos los nodos del XML con la función PHP foreach().
  • Por cada nodo recorrido cargamos en la variable $atributos los atributos del nodo usando la función attributes().
  • Sacamos los valores por pantalla.

Sintaxis de la función getNameSpaces() de PHP simpleXML

Os muestro la sintaxis:

El único parámetro a pasar el $recursivo. Si el valor es ‘TRUE‘ devuelve los namespaces del nodo actual y sus nodos hijos, en caso de ser ‘FALSE’ devuelve los namespaces declarados en la raíz del XML. Por defecto el valor es ‘FALSE’.

Obtener los namespaces de un XML con la función getNameSpaces()

Nueva código de ejemplo para sacar los namespaces de un XML con la siguiente estructura:

El código PHP sería el siguiente:

La explicación es sencilla:

  • Se carga el XML con la función de PHP simpleXML simplexml_load_file().
  • Recorremos los nodos del XML con la función PHP foreach().
  • Por cada nodo recorrido saco por pantalla el título, link y description.
  • Después obtengo los namespaces de la variable $elemento con la función getNameSpaces().
  • En la variable $media guardo los namespaces con nombre ‘media’.
  • Saco su valor.

Sintaxis de xpath()

Con xpath() podemos acceder a los nodos de otra manera diferente a las vistas anteriormente, su sintaxis es:

En el parámetro $path pondremos el nodo del XML al que queremos acceder.

Obtener información de los nodos de un XML con xpath()

Os pongo otro nuevo ejemplo con un XML con la siguiente estructura:

Y el código PHP es:

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.

ACEPTAR
Aviso de cookies