Manual de PHP: XML

Procesar documentos XML con SimpleXML en PHP

La extensión SimpleXML de PHP permite convertir un documento XML en un objeto que puede ser procesado con selectores de propiedades e iteradores de matrices.

SimpleXML: Acceder a elementos únicos

Veamos cómo acceder a elementos únicos de un documento XML similar a:

<?xml version="1.0" encoding="UTF-8"?>
<feed>
    ...
    <name>10 Years</name>
    ...
</feed>

Por ejemplo, para obtener name el código será:

<?php
$feed = "http://www.domain.com/feed/info.xml";
// volcar el feed en un objeto SimpleXML
$xml = simplexml_load_file($feed);
echo $xml->name;
?>

SimpleXML: Acceder a elementos no únicos

Veamos cómo acceder a elementos no únicos de un documento XML similar a:

<?xml version="1.0" encoding="UTF-8"?>
<feed>
    ...
    <tag>
        <name>rock</name>
    </tag>
    <tag>
        <name>metal</name>
    </tag>
    <tag>
        <name>post-grunge</name>
    </tag>
    ...
</feed>

Por ejemplo, para obtener todos los tag->name el código será:

<?php
$feed = "http://www.domain.com/feed/info.xml";
// volcar el feed en un objeto SimpleXML
$xml = simplexml_load_file($feed);
foreach ($xml->tag as $tag) {
    echo $tag->name;
}
?>

SimpleXML: Acceder a atributos

Veamos cómo acceder a los atributos de un documento XML similar a:

<?xml version="1.0" encoding="UTF-8"?>
<feed>
    ...
    <link rel="alternate" href="http://www.domain.com"/>
    <image size="small">http://www.domain.com/images/44.jpg</image>
    <image size="large">http://www.domain.com/images/55.jpg</image>
    ...
</feed>

Por ejemplo, para obtener el atributo href de link el código será:

<?php
$feed = "http://www.domain.com/feed/info.xml";
// volcar el feed en un objeto SimpleXML
$xml = simplexml_load_file($feed);
echo $xml->link->attributes()->href;
?>

Para obtener los campos image utilizando el atributo size para filtrar, el código será:

<?php
$feed = "http://www.domain.com/feed/info.xml";
// volcar el feed en un objeto SimpleXML
$xml = simplexml_load_file($feed);
foreach ($xml->image as $image) {
    switch((string) $image['size']) {
        case 'small':
            echo $image;
            break;
        case 'large':
            echo $image;
            break;
    }
}
?>

SimpleXML: Trabajar con namespaces

Veamos cómo trabajar con namespaces.

Dado que en XML los nombres de las etiquetas (elementos) son definidos por el desarrollador, se suelen utilizar prefijos para evitar conflictos entre documentos XML procedentes de distintas fuentes. Cuando se utilizan prefijos se debe especificar el XML namespace (espacio de nombres XML) mediante la etiqueta xmlns. Veamos cómo acceder a los elementos namespace de un documento XML similar a:

<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns:media="http://search.yahoo.com/mrss/">
    ...
    <entry>
        <media:group>
            <media:title type="plain">10 Years - Wasteland</media:title>
            <media:player url="http://www.domain.com/watch?v=ciuca"/>
        </media:group>
    </entry>
    ...
</feed>

Por ejemplo, para obtener media:title y media:player el código será:

<?php
$feed = "http://www.domain.com/feed/info.xml";
// volcar el feed en un objeto SimpleXML
$xml = simplexml_load_file($feed);
$media = $xml->entry->children('http://search.yahoo.com/mrss/');
echo $media->group->title;
echo $media->group->player->attributes()->url;
?>

SimpleXML: Modificar valores

SimpleXML permite modificar los datos de un documento XML. Por ejemplo, para modificar name y convertir este documento XML…

<?xml version="1.0" encoding="UTF-8"?>
<feed>
    ...
    <name>10 Years</name>
    ...
</feed>

… en este otro…

<?xml version="1.0" encoding="UTF-8"?>
<feed>
    ...
    <name>Miss Coder</name>
    ...
</feed>

… el código será:

<?php
$feed = "http://www.domain.com/feed/info.xml";
// volcar el feed en un objeto SimpleXML
$xml = simplexml_load_file($feed);
$xml->name = "Miss Coder";
?>

SimpleXML: Añadir elementos y atributos

SimpleXML permite añadir elementos y atributos en un documento XML. Por ejemplo, para convertir este documento XML…

<?xml version="1.0" encoding="UTF-8"?>
<feed>
    ...
    <movie>
        <characters>
            <character>
                <name>Megan</name>
                <actor>Anna Smith</actor>
            </character>
        </characters>
    </movie>
    ...
</feed>

… en este otro…

<?xml version="1.0" encoding="UTF-8"?>
<feed>
    ...
    <movie>
        <characters>
            <character>
                <name>Megan</name>
                <actor>Anna Smith</actor>
            </character>
            <character>
                <name>Mr. Parser</name>
                <actor>John Doe</actor>
            </character>
        </characters>
        <rating type="mpaa">PG</rating>
    </movie>
    ...
</feed>

… el código será:

<?php
$feed = "http://www.domain.com/feed/info.xml";
// volcar el feed en un objeto SimpleXML
$xml = simplexml_load_file($feed);
 
// añadir character
$character = $xml->movie[0]->characters->addChild('character');
$character->addChild('name', 'Mr. Parser');
$character->addChild('actor', 'John Doe');
 
// añadir rating
$rating = $xml->movie[0]->addChild('rating', 'PG');
$rating->addAttribute('type', 'mpaa');
?>

Recursos

Artículos en la categoría "Manual de PHP"

  1. Manual de PHP: Estructuras de control
  2. Manual de PHP: Funciones
  3. Manual de PHP: Objetos
  4. Manual de PHP: Formularios web
  5. Manual de PHP: Imágenes
  6. Manual de PHP: XML
  7. Manual de PHP: MySQL
  8. Manual de PHP: Sesiones
  9. Manual de PHP: Matrices
  10. Manual de PHP: Expresiones regulares
  11. Manual de PHP: Sanear datos de usuario
  12. Manual de PHP: Email
  13. Manual de PHP: Evitar el hotlinking de los buscadores

3 Comments:

  1. Hola mira una pregunta, es que necesito acer un formulario desde PHP que me Guarde , Modifique y Elimine en un XML y la vverdad no tengo idea me podrias ayudar y responder a mi E-mail
    Muchas gracias

  2. hey que tal!, muchas gracias por la clase, oye tengo un problema, al yo hacer esto dentro de mi documento, no me guarda nada de nada, no se si me podrias ayudar
    gracias

  3. hola david. me gustaria que me ayudaras si es que encontraste una solución.