CXXXIX. Funciones SimpleXML

Introducción

La extensión SimpleXML ofrece un conjunto de herramientas simples y fáciles de usar para convertir un XML en un objeto que puede ser procesado con selectores de propiedades e iteradores de matrices.

Requisitos

La extensión SimpleXML requiere PHP 5.

Instalación

La extensión SimpleXML está habilitada por defecto. Para deshabilitarla, usa la opción de configuración --disable-simplexml.

Ejemplos

Varios ejemplos de la referencia requieren una cadena XML. En vez de repetir esta cadena cada vez, la ponemos en un fichero php que incluiremos en cada ejemplo. éste fichero lo mostramos en la siguiente sección de ejemplo. Alternativamente, puedes crear un documento XML y cargarlo mediante la función simplexml_load_file().

Ejemplo 1. Fichero de Inclusión ejemplo.php con una cadena XML

<?php
$xmlstr
= <<<XML
<?xml version='1.0' standalone='yes'?>
<movies>
<movie>
  <title>PHP: Behind the Parser</title>
  <characters>
   <character>
    <name>Ms. Coder</name>
    <actor>Onlivia Actora</actor>
   </character>
   <character>
    <name>Mr. Coder</name>
    <actor>El Act&#211;r</actor>
   </character>
  </characters>
  <plot>
   So, this language. It's like, a programming language. Or is it a
   scripting language? All is revealed in this thrilling horror spoof
   of a documentary.
  </plot>
  <rating type="thumbs">7</rating>
  <rating type="stars">5</rating>
</movie>
</movies>
XML;
?>

La simplicidad de SimpleXML aparece más claramente cuando se extrae una cadena o un número de un documento XML básico.

Ejemplo 2. Obteniendo <plot>

<?php
include 'ejemplo.php';

$xml = simplexml_load_string($xmlstr);

echo
$xml->movie[0]->plot; // "So this language. It's like..."
?>

Ejemplo 3. Accediendo a elementos no únicos en SimpleXML

Cuando existen multiples instancias de un elemento de un mismo elemento padre, se aplican las técnicas normales de iteración.

<?php
include 'ejemplo.php';

$xml = simplexml_load_string($xmlstr);

/* Para cada nodo <movie>, mostramos un <plot>. */
foreach ($xml->movie as $movie) {
   echo
$movie->plot, '<br />';
}

?>

Ejemplo 4. Usando atributos

Por ahora, solo hemos cubierto la parte de leer los nombres de los elementos y sus valores. SimpleXML también puede acceder a los atributos de los elementos. Acceder a los atributos de un elemento es como acceder a los elementos de una array.

<?php
include 'ejemplo.php';

$xml = simplexml_load_string($xmlstr);

/* Accede a los nodos <rating> de la primera pel&iacute;cula.
* Output the rating scale, too. */
foreach ($xml->movie[0]->rating as $rating) {
    switch((string)
$rating['type']) { // Obtenemos los atributos como elementos &iacute;ndice
    
case 'thumbs':
        echo
$rating, ' thumbs up';
        break;
    case
'stars':
        echo
$rating, ' stars';
        break;
    }
}
?>

Ejemplo 5. Comparando Elementos y Atributos con Texto

Para comparar un elemento o atributo con una cadena o pasarlo a una función que requiera una cadena, debes convertirlo a cadena mediante (string). De otra forma, PHP tratará el elemento como un objeto.

<?php     
include 'ejemplo.php';

$xml = simplexml_load_string($xmlstr);

if ((string)
$xml->movie->title == 'PHP: Behind the Parser') {
    print
'Mi pel&iacute;cula favorita.';
}

htmlentities((string) $xml->movie->title);
?>

Ejemplo 6. Usando Xpath

SimpleXML incluye soporte nativo de Xpath. Para encontrar todos los elementos <character>:

<?php
include 'ejemplo.php';
$xml = simplexml_load_string($xmlstr);

foreach (
$xml->xpath('//character') as $character) {
    echo
$character->name, 'played by ', $character->actor, '<br />';
}
?>

'//' sirve como comodín. Para especificar paths absolutos, hay que omitir una de las barras invertidas.

Ejemplo 7. Definiendo valores

Los datos en SimpleXML no tienen porqué ser constantes. El objeto permite la manipulación de todos sus elementos.

<?php
include 'ejemplo.php';
$xml = simplexml_load_string($xmlstr);

$xml->movie[0]->characters->character[0]->name = 'Miss Coder';

echo
$xml->asXML();
?>

El código de arriba mostrará un documento XML nuevo, como el original, excepto que el nuevo XML tendrá Miss Coder en vez de Ms. Coder.

Ejemplo 8. Interoperabilidad con DOM

PHP tiene un mecanismo para convertir nodos XML entre los formatos de SimpleXML y DOM. Este ejemplo muestra como se podría cambiar un elemento DOM a otro SimpleXML.

<?php
$dom
= new domDocument;
$dom->loadXML('<books><book><title>blah</title></book></books>');
if (!
$dom) {
     echo
'Error al parsear el documento';
     exit;
}

$s = simplexml_import_dom($dom);

echo
$s->book[0]->title;
?>

Tabla de contenidos
SimpleXMLElement->asXML --  Devuelve una cadena XML basada en el objeto SimpleXML
SimpleXMLElement->attributes --  Identifica los atributos de un elemento
SimpleXMLElement->children --  Encuentra los hijos del nodo dado
SimpleXMLElement->xpath --  Ejecuta una petición Xpath en la cadena XML
simplexml_import_dom --  Obtiene un objeto SimpleXMLElement a partir de un nodo DOM.
simplexml_load_file --  Interpreta un fichero XML en un objeto
simplexml_load_string --  Interpreta una cadena XML en un objeto