sábado, julio 11, 2009

DOM - Document Object Model -> 2ª Parte

Pequeña definición de introducción:
"(..)es esencialmente una interfaz de programación de aplicaciones que proporciona un conjunto estándar de objetos para representar documentos HTML y XML, un modelo estándar sobre cómo pueden combinarse dichos objetos, y una interfaz estándar para acceder a ellos y manipularlos.
A través del DOM, los programas pueden acceder y modificar el contenido, estructura y estilo de los documentos HTML y XML, que es para lo que se diseñó principalmente.
El responsable del DOM es el consorcio W3C (World Wide Web Consortium).
En efecto, el DOM es u
na API para acceder, añadir y cambiar dinámicamente contenido estructurado en documentos con lenguajes como ECMAScript (Javascript).”
Referencia, Wikipedia: http://es.wikipedia.org/wiki/Document_Object_Model


A continuación voy a presentar algunos ejemplos con su explicación.
(Supongo que ya conocen XML).
Vamos a usar el siguiente XML:
biblioteca.xml



John Doe
Existo?
NoSeQue


Juan Perez
Uno mas
NoSeQue



La estructura es la siguiente:
Tenemos el tag parent ("padre") , y en tenemos que seria un child y dentro de este tenemos ,,.
Una imagen ilustrando el árbol DOM del xml:
Image Hosted by ImageShack.us
El nodo (node) biblioteca tiene dos (o más) hijos (child), que en nuestro ejemplo es el nodo libro que a su vez tiene 3 nodos hijos (titulo,autor,editor) y estos un nodo hijo con texto.
Leer archivo XML con DOM
Conociendo la estructura, pasamos a leer el xml desde php:
leerXml.php

load('biblioteca.xml');
//cargamos todos los libros.
$biblioteca = $dom->getElementsByTagName("libro");
foreach($biblioteca as $libro){
$titulo = $libro->getElementsByTagName("titulo");
//Obtengo el titulo.
$titulo = $titulo->item(0)->nodeValue;

$autor = $libro->getElementsByTagName("autor");
$autor = $autor->item(0)->nodeValue;

$editor = $libro->getElementsByTagName("editor");
$editor = $editor->item(0)->nodeValue;
echo "Titulo: $titulo
  • Autor: $autor
  • Editor: $editor
\n";
}
?>


De esta forma logramos mostrar el contenido del archivo xml.
¿Por que item(0)?: Si vemos nuestra estructura contamos con solo un child,
titulo,autor,editor. En el caso de que el libro tenga varios child habria que recorrer el valor de item().
Generar XML con DOM
Para crear un xml recomiendo tener los datos en un array, veamos el ejemplo:

$biblioteca = array();
$biblioteca[] = array(
'titulo' => 'Otro Mas',
'autor' => 'Juan Perez',
'editor' => 'NoSeQue'
);
$biblioteca[] = array(
'titulo' => 'De Aca',
'autor' => 'John Doe',
'editor' => 'NoSeQue'
);
$dom = new DomDocument();

$dom->formatOutput = true; //Para que el xml salga indentado
//Creo el tag padre, (parent)
$padre = $dom->createElement('biblioteca');
$dom->appendChild($padre);
foreach($biblioteca as $libro){
//Creo el child de biblioteca, libro
$lib = $dom->createElement('libro');

$titulo = $dom->createElement('titulo');
$titulo->appendChild($dom->createTextNode($libro['titulo'])); //Creo un node con el titulo

$autor = $dom->createElement('autor');
$autor->appendChild($dom->createTextNode($libro['autor'])); //Idem anterior

$editor = $dom->createElement('editor');
$editor->appendChild($dom->createTextNode($libro['editor']));// ;-)

$lib->appendChild($titulo); //Agrego el autor al libro
$lib->appendChild($autor); //Idem
$lib->appendChild($editor); //Idem
$padre->appendChild($lib); //Agrego el libro a la biblioteca
}
if($dom->save('nuevo.xml')){
echo 'Generado con Exito';
}else{
echo 'Ups!';
}
?>

Esto fue mas o menos lo mismo que en el post anterior, pero supongo yo, mejor explicado.
DOM es una herramienta muy potente que hoy en dia esta muy de moda con ajax. Sobre XML & PHP existen muchas herramientas recomiendo darse una vuelta por:
XML Manipulation
Esto es todo por el momento, espero les sea de alguna utilidad.

No hay comentarios.: