PDA

Ver la Versión Completa : Generar un documento XML (miro en el google pero na)


papulo
02-10-2006, 11:14:55
Primero me explico y luego pregunto.

Tengo un cliente que me pide que genere un fichero XML, dispongo de una servidor propio con apache+php+firebird y tengo un dominio propio (del trabajo) http://www.factorydata.com.

Primera pregunta ¿como verá el cliente el XML que le tengo que devolver?
No me refiero a la estructura, sino a si se verá algo en la pantalla como en la imagen que adjunto ¿o es totalmente transparente al navegador y ya esta?

Ya puestos, estoy buscando algún manual/tutorial/santogrialparadummies que me indique como generar un XML con PHP, algo ilustrativo que me indique la estructura y los comandos básicos, solamente eso.

Cuando busco por el google "http://www.google.es/search?q=generar+documento+xml+con+php&start=0&ie=utf-8&oe=utf-8&client=firefox-a&rls=org.mozilla:es-ES:official" (http://www.google.es/search?q=generar+documento+xml+con+php&start=0&ie=utf-8&oe=utf-8&client=firefox-a&rls=org.mozilla:es-ES:official)

No me sale nada concluyente y no tengo experiencia suficiente con PHP como para enfocar la búsqueda de forma mas efectiva.

Resumiendo:
-La estructura del XML.
-Como generarlo.
-Ejemplo ilustrativo.
-y la voluntá...

Gracias por la ayuda, como siempre, que es bien recibida y seguiré surfeando y esperando respuestas.

Saludos a todos.

Ñuño Martínez
02-10-2006, 12:46:08
Yo tampoco soy un experto acerca de PHP y tampoco sobre XML. Aun así te adjunto el código fuente que uso yo para generar archivos RSS (un tipo de XML). Seguro que hay formas mejores de hacerlo (estoy en ello ;) ) pero seguro que sirve para que te hagas una idea.

<?php
# Aplicación para la generación de los archivos RSS de Burdjia.com.

#########################
# Archivo en castellano #
#########################
echo "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\n";
echo "<rss version=\"2.0\">\n";
echo " <channel>\n";
echo " <title>Burdjia.com</title>\n";
echo " <link>http://www.burdjia.com/</link>\n";
echo " <description>Burdjia es un estudio de diseño de videojuegos con unas ideas poco comunes respecto a cómo deberían ser los juegos de ordenador. También desarrolla librerías y realiza trabajos para otras empresas.</description>\n";

# NOTICIAS.
# Obtener sólo noticias en castellano.
$LENGUAJE = "CAST";
# Crea la consulta, según se haya pedido.
include ("obten_noticias.php");
# Conectamos con la base de datos.
$Conexion = mysql_connect ("atawalpayupanki", "atawalpayupanki", "atawalpayupanki");
if (!$Conexion) die ("No pudo conectarse a la base de datos");
$BD = mysql_select_db ("atawalpayupanki", $Conexion); # Selecciona la base de datos.
# Hacemos la consulta.
$Result = mysql_query ($sql, $Conexion);
if ($Result) {
while ($entrada = mysql_fetch_object ($Result)) {
# Obtenemos la fecha.
$Hoy = getdate ($entrada->SEGUNDOS);
# Construimos el item.
echo "\n <item>\n";
echo " <title>".$entrada->TCAST."</title>\n";
echo " <guid>http://www.burdjia.com/#".$Hoy[mday]."_".$Hoy[mon]."_".$Hoy[year]."</guid>\n";
echo " <pubDate>".date ('r', $entrada->SEGUNDOS)."</pubDate>\n";
echo " <link>http://www.burdjia.com/#".$Hoy[mday]."_".$Hoy[mon]."_".$Hoy[year]."</link>\n";
echo " <description><![CDATA[".$entrada->CAST."]]></description>\n";
echo " </item>\n";
}
}

# IMAGEN DEL DÍA
# Obtiene la lista de imagenes.
$Result = mysql_query ('SELECT * FROM `IDD` ORDER BY `ARCH` DESC LIMIT 0, 3', $Conexion);
if ($Result) {
while ($entrada = mysql_fetch_object ($Result)) {
# Obtenemos la fecha.
$Fecha = $entrada->DIA." de ";
switch ($entrada->MES) {
case 1: $Fecha .= "Enero"; break;
case 2: $Fecha .= "Febrero"; break;
case 3: $Fecha .= "Marzo"; break;
case 4: $Fecha .= "Abril"; break;
case 5: $Fecha .= "Mayo"; break;
case 6: $Fecha .= "Junio"; break;
case 7: $Fecha .= "Julio"; break;
case 8: $Fecha .= "Agosto"; break;
case 9: $Fecha .= "Septiembre"; break;
case 10: $Fecha .= "Octubre"; break;
case 11: $Fecha .= "Noviembre"; break;
case 12: $Fecha .= "Diciembre"; break;
}
$Fecha .= ' de 20';
if ($entrada->ANNO < 10) $Fecha .= '0';
$Fecha .= $entrada->ANNO;
# Calcula la fecha de publicación.
$Segundos = mktime (12, 0, 0, $entrada->MES, $entrada->DIA, $entrada->ANNO);
# Construimos el item.
echo "\n <item>\n";
echo " <title>Imagen del día (".$Fecha.")</title>\n";
echo " <guid>http://www.burdjia.com/IDD/index.php?ID=".$entrada->ARCH."</guid>\n";
echo " <pubDate>".date ('r', $Segundos)."</pubDate>\n";
echo " <link>http://www.burdjia.com/IDD/index.php?ID=".$entrada->ARCH."</link>\n";
echo " <description><![CDATA[".$entrada->DESCRIPCION."]]></description>\n";
echo " </item>\n";
}
}
echo " </channel>\n";
echo "</rss>";
?>

[edit]Olvidé poner el enlace al archivo "resultado". Aquí está (http://www.burdjia.com/rss.php).

papulo
02-10-2006, 12:56:31
Ya está impreso y ahora me pongo a estudiarlo con detenimiento.

Yo creía que el resultado tenía que tener extensión *.xml pero veo que no.

Muchas gracias Ñuño.

Ñuño Martínez
02-10-2006, 13:01:25
Yo creía que el resultado tenía que tener extensión *.xml pero veo que no.

Por lo que sé, la extensión depende de para qué vayas a usarlo. Yo le puse la extensión php porque es un programa PHP, pero creo que hubiera funcionado también poniendo como extensión "*.rss" ó "*.xml" (creo que depende de la configuración de Apache). Por ejemplo, el nuevo lenguaje web XHTML (que sustituye al HTML por XML) admite como extensión tanto *.xhtml como *.html y *.htm

dec
02-10-2006, 15:29:33
Hola,

Hasta donde yo llegué no he generado archivos XML sino es como el compañero Ñuño comenta, es decir, un tanto "a mano", escribiendo tanto la estructura como los datos, propiamente dichos, directamente, sin utilizar ninguna clase, extensión de PHP o similar.

Me consta que hay clases para trabajar con XML, esto es, un poco parecido a como podemos hacer en Delphi con la clase "TXmlDocument". Ahora mismo no sabría decirte de ninguna dirección, pero, aquí mismo, en estos Foros, me parece que se ha comentado alguna vez sobre el tema.

Respondo más bien porque acabo de leer en otro Hilo tuyo, Papulo, que pensabas en mí cuando lo hacías en PHP... ¡ay, señor! ¡Y ni siquiera había visto el Hilo al que hago referencia sino hasta hoy mismo, casi por casualidad! Bueno. Tú mismo, no sé de dónde sacaste que yo pudiera saber más que tú de PHP... en todo caso a uno estas cosas como que le dejan el ego agustito. :eek: :)


Primera pregunta ¿como verá el cliente el XML que le tengo que devolver?
No me refiero a la estructura, sino a si se verá algo en la pantalla como en la imagen que adjunto ¿o es totalmente transparente al navegador y ya esta?

No vi la imagen que adjuntas... ¿la llegaste a adjuntar? En todo caso, otra vez, hasta donde llegué, los navegadores (y no navegador) pueden hacer con el XML de su capa un sayo, esto es, cada cual "representará" el XML como mejor le parezca: unos lo podrán hacer en forma de árbol, otros en forma de "tabla", otros... quién sabe.

Algo que apenas he tocado, pero, que sé que existe, es el XSL (ni siquiera sé si acierto con las siglas), que viene a ser una hoja de estilo asociada a un documento XML, de manera similar a como se puede asociar una hoja de estilo (CSS, en este caso) a un documento HTML. Tendrías que investigar un poco sobre esto, pero, el caso es que es posible "transformar" el documento XML, o sea sus datos, un tanto a tu antojo, gracias a "XSL", con el fin de mostrar los datos del XML en el navegador de una manera "personalizada".

Según he leído y puede comprobar cualquiera, la forma de representar los documentos XML por los navegadores, no es la mejor para un "usuario neófito", esto es, los datos se muestran, pero, también se muestra la estructura del documento... en fin, supongo que los navegadores no pueden hacer mucho más, puesto que el XML es un "lenguaje" un tanto anárquico, o sea, en el que puedes y de hecho tienes tus propias etiquetas... que no tienen porqué ser estas o aquellas... y esto hace que los navegadores no puedan "parsear" el XML como no sea de una forma "generalista": bien mostrando su contenido como un árbol o como una tabla, por ejemplo.

No sé. Pienso que tendrías que echar un vistazo a XSL, puesto que me parece que puede ser lo que estés precisando. Como no fuera que tu encargo fuera generar el XML y punto pelota: cómo se lea ese documento... puede no correr por cuenta tuya, puede que tu cliente cuente con algún programa que se encarge de ese asunto. En todo caso no estaría demás que le dieras un vistazo, por lo menos, a las hojas de estilo para XML, o sea, al XSL famoso.


Yo creía que el resultado tenía que tener extensión *.xml pero veo que no.

Bueno. Ahí puede que Ñuño ya dijera lo que ocurre... y es que depende. Por ejemplo, a un lector de "feeds" le basta conque le llegue el contenido apropiado, con la cabecera apropiada, es decir, con la conocida función "header" de PHP se le indica al cliente (sea este un lector de "feeds", sea un navegador) que el contenido se trata de XML, y ya él se encarga de hacer lo propio con el mismo, o sea.


header('Content-type: text/xml; charset="utf-8"');

Ahora bien, si el contenido XML que generas fuera "descargable",... pues sería el caso de indicar en las cabeceras HTTP que se trata de contenido XML y además que se descargue con la extensión correspondiente, si es que esto fuera a tener alguna utilidad: por ejemplo para que tu cliente pudiera descargar el archivo XML y supiera perfectamente de qué se trata, puesto que la misma extensión se lo indicara.

Sobre esto último, la verdad, es que me pierdo un poco. Copiaré una función a continuación que puede no ser perfecta, pero, que, está funcionando ahora mismo en cierta página Web. Como podrás ver en la función esta recibe como parámetro cierta "salida" (que podría ser el código XML, propiamente) y como un segundo parámetro un "tipo de salida". En todo caso lo que quiero es que veas cómo puede indicársele al cliente (navegador) que tiene que descargar un archivo (con la salida) y que este archivo tiene una determina extensión, un determinado tamaño, etc.


/**
* Retorna la salida de cualquiera de los formatos de exportación.
* Con las cabeceras que usamos pretendemos forzar la descarga del
* archivo con los enlaces exportados. Nótese cómo usamos el pará-
* metro $formato para establecer la extensión del archivo de salida.
*
* @author dec
* @since 0.6b
* @version 0.3
* @access private
* @param string $salida
* @param string $formato
*/
function Salida($salida, $formato = 'html')
{
global $usuario;

if($this->comprimirSalida && function_exists('gzencode'))
{
$salida = gzencode($salida);
header("Content-Type: application/x-bzip2");
header("Content-Disposition: attachment; filename=".$usuario->LoginUsuario()."-loturak.$formato.zip");
} else {
header("Content-Type: application/force-download");
header("Content-Disposition: attachment; filename=".$usuario->LoginUsuario()."-loturak.$formato");
}
header("Content-Description: File Transfer");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Length: " . strlen($salida));
echo $salida;
die;
}

No he tocado para nada la función, creo que puedes entender más o menos lo que quiero decir, otra cosa es que te sirva para algo. Si tienes cualquier otro comentario pues ya sabes que estamos por aquí para tratar de echar una mano.

papulo
02-10-2006, 16:45:31
Bueno,ya lo tengo implementado.

http://www.factorydata.com/elecsysxml/elecsysxml.php?request_param=TECH_INFO&ref_num=s114606a&id_sup=21

Me devuelve un bonito XML, ahora miraré lo de las cabeceras para que devuelva un archivo con extensión XML,pero me costará que de eso no tengo ni idea... Jejejeje!

Gracias por la ayuda y si veis que está mal, no dudeis en decirmelo.

Saludooox!

papulo
02-10-2006, 17:19:45
Ya me devuelve un archivo 100% XML (que me lo reconoce el firefox como tal y me lo dice, que majo que es el navegador este), ahora que se las apañen los gabachos, pero aun así, gracias por al ayuda Ñuño y Dec, me habeis alegrado el día cosa buena y he aprendido algo requeteinteresante.

¡Un abrazo a todos!