Si podeis usar PHP 5, est� "chupado" crear nodos en un documento XML

        Por ejemplo (lo voy comentando para que veas lo que voy haciendo):

<?php
// esto crea un xml de error si hay un fallo en la conexi�n a la base de
datos en cuesti�n a trav�s de PEAR DB:

if (DB::isError($dbpDBConn))
{
        // pongo las cabeceras del documento adecuadas:
        header('Content-Type: text/xml');
        // creo un nuevo documento XML v.1.0 y con codificaci�n UTF-8 :
        $ddxmlObjectEr = new DomDocument('1.0', 'UTF-8');       
        // Creo un nodo de nombre <ERROR> :
        $dexmlErrorNode = $ddxmlObjectEr->createElement('ERROR');
        // le agrego un atributo que se llama datequeryError, y le pongo la
fecha y hora actual:
        $dexmlErrorNode->setAttribute("datequeryError", date('Y-m-d
H:i:s'));
        // creo un nodo de nombre <ERRORNAME> :
        $dexmlErrorNameNode = $ddxmlObjectEr->createElement('ERRORNAME');
        // creo un nodo de tipo texto:
        $dtxmlTexto = $ddxmlObjectEr->createTextNode(htmlentities("Error en
conexi�n a base de datos", ENT_QUOTES, "UTF-8"));
        // le agrego el nodo de tipo texto al nodo <ERRORNAME> :
        $dexmlErrorNameNode->appendChild($dtxmlTexto);
        // le agrego al nodo <ERROR> el nodo <ERRORNAME> que he creado:
        $dexmlErrorNode->appendChild($dexmlErrorNameNode);
        // creo un nodo de nombre <ERRORDESC> :
        $dexmlErrorNodeDesc = $ddxmlObjectEr->createElement('ERRORDESC');
        // creo un nodo de tipo texto (con la descripci�n del error que me
dan los m�todos de PEAR DB, lo escribo con 
        // htmlentities por el tema de la codificaci�n y charset:
        $dtxmlTexto =
$ddxmlObjectEr->createTextNode(htmlentities($dbpDBConn->getMessage(),
ENT_QUOTES, "UTF-8"));  
        // le agrego el nodo de tipo texto al nodo <ERRORDESC> :
        $dexmlErrorNodeDesc->appendChild($dtxmlTexto);
        // le agrego al nodo <ERROR> el nodo <ERRORDESC> que he creado:
        $dexmlErrorNode->appendChild($dexmlErrorNodeDesc);
        // le agrego el nodo <ERROR> al documento XML que se crea al
principio
        $ddxmlObjectEr->appendChild($dexmlErrorNode);
        // "salvamos" el objeto XML y lo sacamos por pantalla:
        echo $ddxmlObjectEr->saveXML();
        // matamos el main de esta p�gina pues hubo error:
        die();
}
?>


        Este c�digo est� sin optimizar, pues no reutilizo variables, me
quedan nodos sueltos por ah�, y no hago unset para liberar memoria; de todas
formas, te puedo decir que va rapidito y sin problemas.

        El problema es que tengas PHP 4, pues entonces ya tienes que mirar
qu� soporte para DOM XML tienes en tu ISP (entiendo que tu aplicaci�n la vas
a tener colgada en un ISP); primero, saber si lo tienes, segundo, saber qu�
librer�as usas; tienes en el manual informaci�n, y la forma de trabajar es
muy similar a la que he puesto aqu� arriba, �nicamente que cambia el nombre
de algunas funciones, pero la forma de hacerlo es la misma.

        Si ya quieres parsear con XSL/XSLT, en PHP 4, es un poco m�s co�azo,
porque dependes de si tienen instaladas unas librer�as, creo recordar que
eran las Sabletron XSLT, o algo as�; no recuerdo exactamente; y eso si que
suele ser bastante m�s inusual. De todas formas, date una vuelta por
http://pear.php.net d�nde tambi�n tienes clases para ayudar a manejar XML,
aunque, si no tienes librer�as de XML en la m�quina d�nde ejecutes los PHP,
y si estas librer�as no est�n declaradas en el php.ini pues... No puedes
hacer mucho :/

        Y por otro lado, no se porqu� no creas el XML directamente en AS,
porque supongo que el XML lo tienes ya en cliente... Ya que el front-end
est� en cliente, vamos, porque el libro de visitas est� en cliente....
M�rate este c�digo (del manual):

// clonar nodo de doc1 y agreg�rselo a doc2:
doc1 = new XML(src1);
doc2 = new XML();
node = doc1.lastChild.cloneNode(true);
doc2.appendChild(node); 

        Con appendChild, createElement y createTextNode deber�as de poder
crear _casi_ cualquier cosa.

        Despu�s, lo mandas a servidor como una cadena de texto, all� lo
guardas como m�s te guste (en base de datos, en un fichero...), y carretilla
:)

        Ojo, entiendo que no tienes todo el libro de visitas en un solo XML,
y al cliente le mandas �nicamente "un cacho"... Lo digo porque si tu tienes
en un XML el libro de visitas, se lo mandas a cliente, este lo modifica, y
lo "updatea" mand�ndolo a servidor, te puede armar un foll�n importante,
porque suponte que en ese lapso de tiempo otro usuario haya cambiado el
libro de visitas antes... A ver c�mo haces los cambios sobre el XML "base"
del servidor :) -bueno, puedes hacer una especie de diff, si no recuerdo mal
hay alguna funci�n PHP para esto-

        De todos modos, guardes d�nde guardes la informaci�n, en un XML, en
base de datos, en d�nde sea, lo suyo es que al cliente le mandes lo que te
pide en cada momento, y nada m�s; y a servidor, env�es el mensaje que
quieres agregar, y nada m�s; y que el servidor se encargue de cambiar el XML
o la base de datos d�nde guardas todo; l�gicamente, si usas un archivo XML,
tienes que tener cuidado con abrirlo para ese instante y bloquearlo, para
que otro usuario concurrente no pueda acceder a la vez, y esas cosas... :)

        Un saludo.

        


-----Mensaje original-----
De: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] En nombre
de [EMAIL PROTECTED]
Enviado el: viernes, 13 de mayo de 2005 10:51
Para: [email protected]
Asunto: Re: [ASNativos] Escribir en archivo XML

A mi me ha pasado un caso similar. Yo con php no tengo ni idea pero me
imagino que no sera muy diferente a este ejemplo con javascript. Espero que
te sirva de ayuda.

Ya nos contaras.

edux


var xmlDoc = Server.CreateObject("Msxml2.DOMDocument");
xmlDoc.async = false;
var ok = xmlDoc.load(Server.MapPath("noticias.xml"));
if(!ok){
    Response.Write("No se pudo leer la fuente XML");
    Response.End();
}
var etiqueta = xmlDoc.createElement("not"); var texto =
xmlDoc.createTextNode("Texto de la noticia"); etiqueta.appendChild(texto);
xmlDoc.getElementsByTagName("listnoticias").item(0).appendChild(etiqueta);
xmlDoc.save(Server.MapPath("noticias.xml"));


donde "listnoticias" es el nombre del nodo padre a los nodos de las
noticias... y "not" es la etiqueta donde insertaremos la noticia

<?xml version="1.0" encoding="iso-8859-1"?> <secciones>  <listnoticias>
  <not>Este es el texto de la noticia 1</not>
  <not>Este es el texto de la noticia 2</not>
  <not>Este es el texto de la noticia 3</not>  </listnoticias> </secciones>








> Tuve el mismo problema que t�. Lo que hice fue lo siguiente. abr�a el 
> archivo XML, metia toda la informacion en una variable como si fuera 
> un String, en esa variable buscaba la posicion del cierre del XML y 
> a��adia el codigo XML de la noticia a raiz de la ultima noticia (tb 
> como un string, borraba toda la informacion de XML abrierto y grababa 
> en �l archivo el valor de la variable. para esto utilize los metodos 
> de fopen(), fread(),
> fwrite()
> .. lo mas curioso que llego a funcionar a la perfeccion. Misterios de 
> la vida.
>
> Pero vamos, me parecio tal �apa, que al final me decante por una BBDD, 
> y te aconsejaria que lo hicieras con BBDD. Mas facil y menos comeduras 
> de tarro y dolores de mocha.
>
> Un saludo.
> ----- Original Message -----
> From: "Eva del Campo" <[EMAIL PROTECTED]>
> To: <[email protected]>
> Sent: Thursday, May 12, 2005 10:39 PM
> Subject: Re: [ASNativos] Escribir en archivo XML
>
>
> php4 tiene bastantes carencias para manipular xml. Lo mejor es 
> utilizar alguna extensi�n (si tienes permisos para instalarla en el 
> servidor), o utilizar alguna clase para simplificar la tarea. Tienes 
> bastantes clases en http://www.phpclasses.org A mi me gusta bastante 
> esta:
> http://www.phpclasses.org/browse/package/1121.html
> Pero la verdad es que tampoco he probado muchas...
>
> Suerte
>
> xxxx
>
> Eva
>
>
>
>> Hola a todos,
>> he creado una "especie" de libro de visitas, y me interesaba hacerlo 
>> de la forma m�s sencilla, as� que lo mont� con un archivo xml, 
>> principalmente porque me interesaba poder coger cada mensaje por 
>> separado.
>>
>> Pero a la hora de escribir en �l un nuevo mensaje me da muchos 
>> problemas,
> lo
>> estoy mirando de hacer
>> con un archivo .php que abre el xml y le a�ade una linea pero no 
>> consigo indicarle bien donde debe escribirla.
>> Alguien sabe de algun tutorial o ejemplo que pueda servirme?
>>
>> espero me haya explicado bien,
>> muchas gracias a todos!
>>
>> ignasi rif�
>> [EMAIL PROTECTED]
>
>
> ----------------------------------
> Lista ASNativos:[email protected]
> http://www.5dms.com/listas
> ----------------------------------
>
> ----------------------------------
> Lista ASNativos:[email protected]
> http://www.5dms.com/listas
> ----------------------------------
>

----------------------------------
Lista ASNativos:[email protected]
http://www.5dms.com/listas
----------------------------------


----------------------------------
Lista ASNativos:[email protected]
http://www.5dms.com/listas
----------------------------------

Responder a