viernes, julio 31, 2009

La Verdad de la Milanesa


Nunca pense que sería capaz de encontrarla, pero en los ultimos meses sentí una perturbacion en la fuerza que poco a poco fue creciendo...desde hace una semana vengo rondando tratando de verificar que esa sea. Lo complicado es saberla en si, solo se que la verdad de la milanesa la tiene la doña que hace las milanesas al cruzar la calle. He dicho!

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.

martes, julio 29, 2008

XML & PHP con DOM

Me econtré con el asunto de leer y escribir archivos XML, investigué un poco y me econtré con varias formas. Por eso me pareció interesante publicar algo para la "postegridad".
Arrancamos..
Vamos a usar el siguiente archivo XML como ejemplo.



Hola Caracola
KaoS
Olla Kaitos a Luisete


Nuevo articulo en desarrolloweb
Raul
Jeje hola, aqui estamos


La forma que en mi caso me pareció la mejor, fue "meter" los datos en una matriz o array para luego usarlo
a gusto. Para mi comodidad hice una función:

function XML_a_Matriz($archivo_xml);

$noticias = $doc->getElementsByTagName( "bloque" );
foreach( $noticias as $noticia )
{
$titulos = $noticia->getElementsByTagName( "titulo" );
$titulo = $titulos->item(0)->nodeValue;

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

$cuerpos= $noticia->getElementsByTagName( "cuerpo" );
$cuerpo= $cuerpos->item(0)->nodeValue;

$noticias_array[] = array(
'titulo' => $noticia,
'autor' => $autor,
'cuerpo' => $cuerpo,
);
}
return $noticias_array;
}
?>
Podemos usar el array para poder agregar datos al XML.

include 'XMLaMatriz.php'
$noticias=XML_a_Matriz("noticias.xml");
$noticias[] = array(
'noticia' => 'PRUEBA1',
'autor' => 'Menganito',
'cuerpo' => 'LoQSea',
);
$doc = new DOMDocument();
$doc->formatOutput = true;

$r = $doc->createElement( "bloque" );
$doc->appendChild( $r );

foreach( $noticias as $noticia_w )
{
$b = $doc->createElement( "noticia" );

$titulo = $doc->createElement( "titulo" );
$titulo->appendChild(
$doc->createTextNode( $noticia_w['titulo'] )
);
$b->appendChild( $titulo );

$autor = $doc->createElement( "autor" );
$autor->appendChild(
$doc->createTextNode( $noticia_w['autor'] )
);
$b->appendChild( $autor );

$cuerpo = $doc->createElement( "cuerpo" );
$cuerpo->appendChild(
$doc->createTextNode( $noticia_w['cuerpo'] )
);
$b->appendChild( $cuerpo );

$r->appendChild( $b );
}

$doc->save("noticias.xml")
?>
Bueno creo que con este ejemplo da para hacer algo mas complejo. Seguiré leyendo.

lunes, julio 10, 2006

Mejorar esta funcion

Luego de crear una función que funcione como yo quiero me he preguntado si esta se puede mejorar.

function desconectar($dir, $archivo)
{
if(file_exists($dir))
{
$this->id = fopen("archivos/listado.txt","r");
$this->lineas = fread($this->id, filesize("archivos/listado.txt"));
fclose($this->id);
unlink("archivos/listado.txt");
$buscar = array (chr(32).",",",".chr(32),$archivo);
$this->lineas = str_replace($buscar,"",$this->lineas);
$this->lineas = ereg_replace(",,",",",$this->lineas);
if (substr($this->lineas, 1)==",")
{
$this->lineas = substr ($this->lineas, 1);
}
$this->id = fopen("archivos/listado.txt","a+");
fwrite($this->id,"".$this->lineas);
fclose($this->id); unlink($dir);
}
return $this->lineas;
}

sábado, junio 24, 2006

Proyecto

Llevaba tiempo pensado hacer una especie de programa de chat que combine java y php, no se si hay algo como esto y tampoco si funcionara pero como siempre digo..piensa positivo.
Lo primero que pienso hacer es crear la parte de php. Al pasar de los dias les voy posteando los baches que me encuentre.

Saludos.