Funciones SimpleXML

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