You are on page 1of 48

1 Qu es eso del XML?

XML significa eXtensible markup language, o lenguaje de anotacin extensible. Ya conocemos el lenguaje HTML (hypertext markup language), lenguaje de anotacin para pgina webs que permite navegacin tipo hipertexto; sin embargo, XML no es slo un lenguaje, es una forma de especificar lenguajes, de ah lo de extensible. Todo lenguaje que se exprese de una forma determinada puede ser XML. Por lo tanto, XML no es un lenguaje para hacer mejores pginas web, sino un lenguaje para informacin auto-descrita, o al menos, auto-descrita si las etiquetas estn bien puestas. XML se inici como un subconjunto de SGML (structured generalized markup language), un standard ISO para documentos estructurados que es sumamente complejo para poder servir documentos en la web. XML es algo as como SGML simplificado, de forma que una aplicacin no necesita comprender SGML completo para interpretar un documento, sino slo el subconjunto que se defina. Los editores SGML, sin embargo, pueden comprender XML. Por tanto, no debe uno pensarse que XML es para crear pginas web, o algo parecido a las pgina web. XML es un lenguaje que cambia el paradigma de programacin: de basada en el funciones u objetos a la programacin basada en el documento. XML se puede usar para cambiar totalmente el paradigma de publicacin; de un programa que recibe unas entradas y produce unas salidas, se pasa a un documento que genera otro documento, o bien programas que toman documentos y producen otros documentos. Por eso, tambin, y, en general, salvo en entornos de servicios web, lo normal es que el XML se use en el servidor, y se sirva otro tipo de documentos, HTML, por ejemplo, que se obtienen a base de una serie de

transformaciones. Precisamente, esto hace que los documentos XML se usen dentro de entornos de aplicaciones. Este entorno de aplicaciones permite publicar documentos XML, que, antes de ser enviados al cliente, sufrirn una serie de transformaciones para adaptarlo a los requisitos del mismo. Algunos ejemplos de entorno de aplicaciones son el Cocoon, un entorno basado en Java, libre, que permite no slo publicar pginas XML, sino tambin incluir programas dentro de las pginas (XSP). No se caracteriza por su velocidad ni amigabilidad, pero es excelente como entorno de desarrollo (y el precio es inmejorable). Otra alternativa gratuita es el AxKit, escrito en Perl. Como alternativas de pago (y bien pagadas) estn el Bea Weblogic (del que puedes leer una introduccin en programacion.com, y el IBM WebSphere Transcoding Publisher. Sobre todos estos y muchos ms se trata en esta discusin en barrapunto, en la cual se menciona, por ejemplo Krysalis, un entorno de publicacin basado en PHP, que incluye facilidades para ser usado a travs del protocolo SOAP, un protocolo de acceso remoto a documentos basado en XML. Dentro de estos entornos de desarrollo y/o publicacin, o usndolo de cualquier otra forma, XML tiene gran nmero de aplicaciones. La mayor parte de los portales y sitios de noticias ya estn basados en XML, porque permite estructurar la informacin y luego aplicarle fcilmente transformaciones para su presentacin. Lo ms normal es que la informacin est almacenada en una base de datos, se convierta a XML y luego se transforme para servirlo al cliente. Otro ejemplo de aplicacin basada en XML es la base de datos discogrfica de Siniestro Total est tambin basada en XML, y adems el cdigo es libre. Muchos weblogs, tales como barrapunto y Slashdot, sirven sus titulares en XML (y RDF), lo cual permite procesarlo fcilmente para, por ejemplo, incluirlos en la pgina personal de uno (ver la barra de la derecha). Todos los

sitios que sirven, o servan, pginas WAP tambin usan, sin otro remedio, XML. Google ofrece un interfaz de programacin para acceder a sus servicios usando SOAP, un interfaz de acceso remoto que usa XML. Y se puede usar en cualquier aplicacin web donde haga falta programacin estructurada.

2 Cmo se usa XML?

Contenido de esta seccin

Para editar documentos XML, al igual que para hacerlo con HTML, se puede hace de dos formas: editndolos como cualquier otro fichero ASCII, usando, si acaso, un editor estructurado como elXEmacs, o bien usar un editor especfico para XML, que entiende las particularidades del lenguaje, lo indenta como est mandado, y te cierra solito las etiquetas.

Cmo editar XML Qu hacer con el XML editado

Para hacer esto hay muchas opciones, tanto en Windows como en Linux, aunque la mayora son de pago. Por ejemplo, XMLSpy tiene un buen entorno, funciona solo para Windows, paro es relativamente inestable (al menos las versiones probadas). eXcelon Stylus permite adems aplicar transformaciones, en un entorno de tres paneles bastante pijo. Tambin es relativamente caro.<oXygen/> es bastante econmico para uso personal o acadmico, y tiene una versin de prueba de treinta das. Est basado en Java, y funciona tanto en Windows como en Linux. Te completa las etiquetas, y es aceptablemente rpido. Se basa tambin en bastantes herramientas libres, tales como Batik y FOP de Apache. Otra opcin, bastante simple, es XMLShell, que permite tambin hacer transformaciones XSLT simples. Una lista extensa, pero sin ningn tipo de comentario, est en Userland software. Tambin suele

haber una buena lista en XMLsoftware, pero en julio 2002 est caido. Habr que esperar a que vuelva. Enfreshmeat se listan hasta 15 herramientas, algunas de las cuales son editores.

Los mismos entornos incluyen facilidades para validar el cdigo XML resultante, pero esto se puede hacer tambin usando analizadores XML, de los cuales hay muchos, de bastante buena calidad, y la mayor parte de ellos gratuitos. Uno de los ms conocidos y usados es el Xerces, del cual hay versiones en Java, en Perl y en C++. Es adecuadamente rpido, y adems incorpora todos los ltimos estndares del W3. Otra opcin, que adems se puede usar desde Internet, es el XParse de Jeremie, que te analiza directamente el documento y te lo presenta en forma de rbol. La mayor parte de los validadores pueden trabajar de dos formas: de forma independiente, y usndolos como libreras desde el lenguaje de programacin de la eleccin de uno; por ejemplo, Xerces se puede usar stand-alone, o bien como una librera xerces.jar, cuyos objetos se pueden instanciar o usar desde el programa de uno. En muchos casos, como en el caso de C#, el XML se puede generar automticamente a partir de la definicin de una clase, o bien, al revs, una clase o un

objeto de una clase se puede generar automticamente a partir de XML a partir de un fichero, de esta forma: csc /doc:doc.xml mylangdoc.cs De la misma forma, usando la herramienta xsd permite convertir definiciones de clase en definiciones de tipos de datos en XML y viceversa, usndolo de esta forma: xsd.exe /c car.xsd convierte una definicin de clase en cdigo C#, o, de forma anloga, pero al contrario: xsd.exe car.exe que convierte un ensamblaje en una definicin de tipo de datos en XML La mayora de los navegadores actuales son capaces de entender XML. Por ejemplo, el Internet Explorer lee los ficheros XML y los trata de una forma especial, pudiendo presentar la jerarqua a diferentes niveles. Otros navegadores, como el Mozilla o el Netscape, tambin entienden XML, aunque no permiten editarlo de forma adecuada ni de presentarlo de forma jerrquica como el IE. En algunos casos, son capaces tambin de aplicar transformaciones tales como XSLT o CSS (cascading style sheets). Contenido de esta seccin

XML bien formado Primer documento XML Constituyentes adicionales de un

3 XML bien formado

documento XML

Como lenguaje de anotacin, las sentencias en XML consisten en una serie de etiquetas (llamadas elementos) con una serie de modificadores (llamados atributos). Las etiquetas pueden estar anidadas unas dentro de otras, pero toda etiqueta que se abra se tiene que cerrar, y siempre en el mismo orden. En caso de que un elemento no tenga pareja (por no tener ningn contenido dentro), se le denomina elemento vaco y se indica con un / al final. Los elementos se agrupan en documentos, tales como el siguiente ( ej1.xml):

<?xml version="1.0" encoding='iso-8859-1' ?> <micasa> <habitacion id='comedor'> <mueble>aparador</mueble> <mueble>sof</mueble> <puerta a='balcn' /> </habitacion> </micasa> Todos los documentos XML deben estar bien formados, y este es el requisito mnimo que deben cumplir los documentos. Eso que significa que se debe cumplir lo siguiente:

si no se utiliza DTD, el documento debe comenzar con un Declaracin de Documento Standalone, tal como la que se pone en la primera lnea. todas las etiquetas deben estar equilibradas: esto es, todos los elementos que contengan datos de

tipo carcter deben tener etiquetas de principio y fin todos los valores de los atributos deben ir entrecomillados (el carcter comilla simple [el apstrofe] puede utilizarse si el valor contiene caracteres comillas dobles, y viceversa): si necesitas ambos, utiliza &apos; y &quot;. As es como se hace en el elemento habitacion cualquier elemento VACO (p.e. aquellos que no tienen etiqueta final como <IMG>, <HR>, y <BR> y otros de HTML) deben terminar con '/>' o debes hacerlos no VACOS aadindoles una etiqueta de fin, tal como se ve en el elemento puerta. no debe haber etiquetas aisladas (< &) en el texto (p.e. debe darse como &lt; y &amp;), y la secuencia ]]> debe darse como ]]&gt; si no ocurre esto como final de una seccin marcada como CDATA; los elementos deben anidar dentro de s sus propiedades (no se deben sobreponer etiquetas, como en el resto de SGML); Los ficheros bien-formados sin-DTD pueden utilizar atributos en sus elementos, pero stos deben ser todos del tipo CDATA, por defecto. El tipo CDATA (character DATA) son caracteres.. Los nombres de las etiquetas pueden ser alfanumricos, comenzando con una letra, e incluyendo los caracteres - y :, aunque este ltimo tiene un significado especial. En este caso usamos un documento XML para describir las estancias de una casa. Con l podemos hacer poca cosa, salvo analizarlo a ver si es correcto. Lo podemos hacer usando el parser XML de Jeremie, que nos dar un resultado tal como el de la imagen.

Lo que ocurre con el parser este es que se lo traga todo, y ya puede uno meter los errores que sean, que no da ninguno. Por eso, merece la pena usar un parser tal como el Xerces, que te puedes bajar directamente de aqu. Para usarlo, tenemos que dar las rdenes siguientes (en Windows) : set PATH=%PATH%;c:\jdk1.1.8\bin set CLASSPATH=%CLASSPATH%;c:\xerces1_4_4\xerces.jar;c:\xerces1_4_4\xercesSamples.jar cd c:\xerces-1_4_4 java dom.DOMWriter fichero.xml Habr que dar, en cada caso, el camino a donde est instalado, de forma efectiva, el Xerces y la mquina virtual Java. En caso de tratarse de Linux, las rdenes sern as:

set PATH=$PATH:/usr/jdk1.1.8/bin set CLASSPATH=$CLASSPATH:/usr/local/xerces1_4_4/xerces.jar:/usr/local/xerces1_4_4/xercesSamples.jar cd /usr/local/xerces-1_4_4 java dom.DOMWriter fichero.xml Por ejemplo, en el caso del fichero anterior, el resultado sera algo as:

mellizo:~$ java -cp /home/jmerelo/soft/xerces1_4_4/xerces.jar:/home/jmerelo/soft/xerce s-1_4_4/xercesSamples.jar dom.DOMWriter public_html/xml/ej1.xml public_html/xml/ej1.xml: <?xml version="1.0" encoding="UTF-8"?> <micasa> <habitacion id="comedor"> <mueble>aparador</mueble> <mueble>sof</mueble> </habitacion> </micasa> Que es muy parecido al original, salvo que la codificacin ha sido cambiada a UTF-8 (un mtodo de codificar caracteres UNICODE), y por eso los acentos aparecen de forma extraa. En este caso, la clasedom.Domwriter lo que hace es leer el fichero de entrada, validarlo, y escribirlo en la salida con indentaciones. En caso de que hubiramos introducido un error, por ejemplo, el fichero siguiente: <?xml version="1.0" encoding="iso-88591"?> <micasa> <habitacion id="comedor"> <mueble>aparador</mueble> <mueble>sof</mueble>

</habitacion> <aqui-peta> </micasa> Nos dara un error de este estilo: public_html/xml/ej2-peta.xml: [Fatal Error] ej2-peta.xml:8:9: The element type "aqui-peta" must be terminated by the matching end-tag "". Que indica que, efectivamente, el elemento tipo aqui-peta debe de estar emparejado con su anti-elemento correspondiente. ENTIDAD CARACTER En un documento &amp; & XML, aparte de elementos y atributos, puede haber &lt; < otras cosas:entidades, &gt; > que representan smbolos "atmicos", que &apos; ' habitualmente deben ser entendidos por el &quot; " navegador, y que se muestran en la tabla adjunta; como se ve, las entidades van encerradas entre los smbolos & y ;; comentarios, que se procesan de forma diferente al texto, y que, tal como en HTML, van precedidos por <!-- y acaban con -->; secciones CDATA, que sirven para extraer del documento XML una seccin, que va a ser interpretada tal cual, sin hacer ninguna modificacin. Puede servir, por ejemplo, para meter HTML "malformado" dentro de un documento XML. Por ejemplo, el documento siguiente incluira todas los elementos anteriores (ej3.xml):

<?xml version="1.0" encoding="iso-88591"?> <!-- Descripcin de los elementos de una casa soada --> <micasa> <habitacion id="comedor"> <mueble>aparador</mueble> <mueble>sof "de poca"</mueble> </habitacion> <habitacion id="cocina"> <mueble><![CDATA[ <p>En la pared de la derecha hay un frigorfico <p>Y en la de la izquierda, slo mugre ]]></mueble> <mueble>fregadero</mueble> </habitacion> </micasa> En este caso, al procesarlo con Xerces, la salida dejar fuera los comentarios, que no forman parte del documento, a no ser que se quieran usar de verdad. Ejercicios 1 1. Crear un documento XML, que contenga la descripcin de un equipo de la liga (jugadores, nombre, entrenador). Procesarlo en el parser JavaScript, y con el Xerces. Usar alternativamente un editor

para Windows. Comprobar que es XML vlido. 2. Crear un documento XML que describa varios libros de una biblioteca o librera, con ttulo, autores, resumen, editorial y los datos que se quieran incluir.

4 Cada cosa en su sitio: XML namespaces

Contenido de esta seccin

Espacios de nombres

Si todo el mundo fuera definiendo etiquetas por ah, un documento acabara siendo un caos de diferentes etiquetas procedentes de diferentes sitios, y, lo que es peor, de etiquetas con el mismo nombre que, en realidad, significan cosas diferentes. El concepto de espacios de nombres(namespaces) permite particionar el conjunto de todos los nombres posibles, de forma que se pueda definir a qu zona de ese espacio corresponde una etiqueta. De esta forma, etiquetas con el mismo nombre, pero definidas por dos autores diferentes, pueden diferenciarse en el espacio de nombres. El espacio de nombres no es esencial en todos los documentos, pero resulta til cuando se usan etiquetas procedentes de diferentes procedencias (por ejemplo, etiquetas nuevas dentro de un documento XML), o etiquetas que se quieren procesar de forma diferente. El especio de nombres de una etiqueta se indica con un prefijo y :, como en este caso: <namespace:etiqueta>. Por ejemplo, se

usan espacios de nombres en el documento siguiente (ej4.xml): <mc:micasa xmlns:mc='http://www.geneura.org/ micasa'> <mc:habitacion mc:id="comedor">

<mc:mueble>aparador</mc:mueble> <mc:mueble>sof "de poca"</mc:mueble> </mc:habitacion> </mc:micasa> En caso de que no se especifique ningn prefijo, se puede tambin especificar qu espacio de nombres sigue, por defecto, el documento:

<micasa xmlns='http://www.geneura.org/micasa'> <habitacion id="comedor"> <mueble>aparador</mueble> <mueble>sof "de poca"</mueble> </habitacion> </micasa>

Conviene recordar que el prefijo de un espacio de nombres es totalmente arbitrario; lo que define un espacio de nombres es, en realidad, el URI. En este documento, donde hemos suprimido elementos que ya se han explicado, se usa la primera lnea para declarar el prefijo del espacio de nombres mediante el atributo xmlns (XML namespace). En este caso, hemos elegido el prefijo mc. A la vez, el espacio de nombres tiene que tener asignado un URI (Universal Resource Identification), que es bsicamente algo que parece una direccin web, pero que no lo es. Lo nico que se requiere de este URI es que sea nico en el documento; adems, es aconsejable que sea siempre el mismo cuando se use el mismo namespace, aunque no es estrictamente necesario, ni se puede comprobar. El que sea un URI significa, entre otras cosas, que si uno se mete en esa direccin no tiene porqu haber nada. Se trata simplemente de asignar un identificador nico. En el resto de los elementos se sigue usando el espacio de nombres. Incluso se puede usar en los atributos, si pertenecen al mismo espacio de nombres. Un documento XML puede tener tantos espacios de nombres como se quieran declarar, y se pueden mezclar elementos de diferentes espacios de nombres, e incluso sin ningn espacio, tal como se hace en el siguiente ejemplo (ej5.xml):

<mc:micasa xmlns:mc='http://www.geneura.org/micasa'

xmlns:mueble='http://www.geneura.org/mueb le'> <mc:habitacion id="comedor"> <mc:mueble>aparador</mc:mueble> <mc:mueble><mueble:nombre>Sof</mueble:no mbre> <mueble:descripcion>Peludo</mueble:descri pcion> <mueble:tamano>Inconmensurable</mueble:ta mano> </mc:mueble> </mc:habitacion> </mc:micasa> En este caso, hemos declarado dos espacios de nombres, mc y mueble, y cada uno lo usamos para una cosa diferente. Incluso un atributo, id, se usa sin espacio de nombres. Conviene usar los espacios de nombres cuando no hay otro remedio, o cuando hay que combinar conjuntos de etiquetas XML procedentes de difefentes procedencias. En todo caso, en la documentacin de un conjunto de etiquetas conviene especificar un espacio de nombres, para que se las pueda identificar fcilmente cuando aparezcan en un documento. Ms adelante, cuando se vean los DTDs, los espacios de nombres servirn para especificar qu diccionario

de datos usar en cada momento; un URI tambin identifica un diccionario de datos. Ejercicios 2 1. Con los equipos de la liga anteriores, usar diferentes espacio de nombres para el equipo en s y para sus componentes. Por ejemplo, los elementos que se incluyan dentro de un jugador pueden tener un espacio de nombres, mientras que la descripcin de un equipo puede tener otro diferente

5 XML y diccionarios de datos

Contenido de esta seccin


XSchema y DTDs Validando XML

En algunos casos, es necesario validaar que un documento XML es correcto, es decir, que las etiquetas que se usan son correctas y que estn anidadas de la forma adecuada. Por ejemplo, en el caso anterior, es conveniente comprobar que la etiqueta raz es siempre micasa, que la casa est compuesta de habitaciones, y las habitaciones tienen muebles y puertas a otros sitios. Incluso se podra intentar que las puertas fueran a otras habitaciones vlidas, aunque es mucho pedir. Para ello se pueden usar dos herramientas: DTD, o data type dictionnary, o bien XSchema, el equivalente en XML. Un XSchema describe la sintaxis correcta de un documento XML. En el caso de los documentos que hemos visto hasta este momento, hay que seguir una serie de pasos para crear un XML Schema. La

forma ms fcil de hacerlo es usando alguna utilidad generadora, tal como DTDGenerator, que crea un DTD tal como el siguiente (ligeramente retocado): <!ELEMENT habitacion ( mueble+, puerta+ ) > <!ATTLIST habitacion id NMTOKEN #REQUIRED > <!ELEMENT micasa ( habitacion+ ) > <!ELEMENT mueble ( #PCDATA ) > <!ELEMENT puerta EMPTY > <!ATTLIST puerta a NMTOKEN #REQUIRED > Este DTD se puede usar para validar los ficheros XML anteriores, aunque usaremos XSchema ms adelante. Lo que indica es que una habitacion tiene uno o varios muebles, y una o varias puertas (que se indica con +); a su vez, micasa puede tener una o ms habitaciones, y cada uno de los elementos pueden tener los atributos que se indican con la sentencia ATTLIST. Como se puede ver, no se trata de XML, aunque se le parezca. Por eso, usando una pequea utilidad escrita en Perl llamada dtd2xsd.pl se puede convertir a XSchema (el resultado est en micasa.xsd, aunque, como en el caso anterior hemos tenido que retocar alguna cosilla):

<schema xmlns='http://www.w3.org/2000/10/XMLSchem a' targetNamespace='http://www.w3.org/namesp ace/' xmlns:t='http://www.w3.org/namespace/'> <element name='habitacion'> <complexType> <sequence> <element ref='t:mueble' maxOccurs='unbounded'/> <element ref='t:puerta' maxOccurs='unbounded'/> </sequence> <attribute name='id' type='NMTOKEN' use='required'/> </complexType> </element> <element name='micasa'> <complexType> <sequence> <element ref='t:habitacion' maxOccurs='unbounded'/> </sequence>

</complexType> </element> <element name='mueble' type="string" /> <element name='puerta'> <complexType> <attribute name='a' type='NMTOKEN' use='required'/> </complexType> </element> </schema> Este documento declara un espacio de nombres por defecto en la primera lnea, que es el que corresponde a los XML Schemas; eso quiere decir que, si no se usa ningn prefijo, los elementos pertenecern a ese espacio de nombres. Tambin declara un espacio de nombres "objetivo" (targetNamespace), que ser el que se est validando, y un prefijo para el mismo, t. A continuacin, se declaran todos los elementos, usando, como es natural, element. Los elementos pueden ser tipos simples (tal como en este caso lo es mueble), o complejos (todos los dems). En el caso del elemento simple, basta declarar el tipo, en este caso, una cadena o string. Los elementos complejos son los que incluyen diferentes elementos anidados (que se declaran consequence), atributos (attribute). Para cada elemento que puede aparecer dentro de un elemento complejo, se declara el nmero mnimo y mximo de veces que debe o puede aparecer

((min|max)Occurs). Por ejemplo, si queremos que en cada habitaci haya al menos una puerta (porque si no, a ver cmo vas a entrar, listo), se puede indicar as: <element ref='t:puerta' minOccurs='1' maxOccurs='unbounded'/> , y, evidentemente, a qu elemento se refiere; como son elementos del espacio "target", se usa el prefijo t. Para los atributos, se indica si son obligatorios mediante el atributo use, y de qu tipo son. Sin embargo, este Schema, como est generado automticamente, puede simplificarse. Especialmente, se pueden sustituir referencias (indicadas con el atributo ref) a otros elementos con los elementos en s. El cdigo quedara de esta forma:

<schema xmlns='http://www.w3.org/2001/XMLSchema'> <element name='micasa'> <complexType> <sequence> <element name='habitacion' minOccurs='1' maxOccurs='unbounded' > <complexType> <sequence> <element name='mueble' type='string' maxOccurs='unbounded'/> <element name='puerta' maxOccurs='unbounded'> <complexType>

<attribute name='a' type='NMTOKEN' use='required'/> </complexType> </element> </sequence> <attribute name='id' type='NMTOKEN' use='required'/> </complexType> </element> </sequence> </complexType> </element> </schema> Este Schema ejemplo se puede usar, evidentemente, para validar los ejemplso anteriores. Para ello, dentro del mismo ejemplo, basta con indicar qu XSchema o DTD es el que siguen. Por ejemplo, se puede aadir lo siguiente al principio <!DOCTYPE micasa PUBLIC "MI CASA" "micasa.dtd"> (tal como se muestra en elfichero ej6.xml, justo despus de la declaracin de XML, para que use ese DTD para validar. Si se quiere usar un XSchema, hay algunas formas no estndar (que se suelen usar con los XSchemata de Microsoft), pero la forma estndar es incluir una serie de atributos en la etiqueta raz, de esta forma:

<micasa xmlns:xsi='http://www.geneura.org/micasa'

xsi:noNamespaceSchemaLocation='micasa.xsd '> Para analizar el documento y validarlo a la vez, hay que irse a la ltima versin de Xerces, la 2; la primera no le hace mucho caso a los XSchemas: java dom.Writer /donde/sea/xerces2_0_2/xercesImpl.jar: /donde/sea/xerces2_0_2/xercesSamples.jar: /donde/sea/xerces2_0_2/xmlParserAPIs.jar dom.Writer -v -s ej7.xml En caso de que haya algn error en el Schema o en el XML, el analizador lo indicara. Para terminar, se puede echar un vistazo a xml.com, donde hay un excelente tutorial sobre cmo comenzar a usar los XML Schemas. Ejercicios 3 1. Disear un XSchema para un documento XML que describa una quiniela, incluyendo resultados. Tener en cuenta que una quiniela tiene 15 partidos slo. Hacer un documento XML que siga ese XML Schema, y validarlo usando Xerces2 o algn otro parser con validacin.

Descripcin

Un documeto XML debe incluir uno o ms elementos.

Documento bien formado

Un documento bien formado con un elemento :

<texto>ste es un documento XML</texto>

Un documento bien formado con varios elementos :

<texto>ste es un <doctipo>documento XML</doctipo> </texto>

Documento con erroresArriba

Un documento XML debe incluir al menos un elemento :

???ste es un documento XML???

CGI Hello
// hello.c #include <stdio.h> #include <string.h> #include <stdlib.h> void main(void) { printf("Content-type: text/html\n\n"); printf("<HTML><HEAD><TITLE>Hello World Wide Web</TITLE></HEAD>"); printf("<BODY BGCOLOR=\"#FFFFFF\"><P ALIGN=CENTER>"); printf("<H1>Primer CGI</H1>"); printf("Hello World Wide Web"); printf("</BODY></HTML>"); } Ejecutar

CGI Variables del sistema


// CGIVariables.c #include <stdio.h> #include <string.h> #include <stdlib.h> void main(void) { printf("Content-type: text/html\n\n"); printf("<HTML><HEAD><TITLE>Nombre</TITLE></HEAD>"); printf("<BODY BGCOLOR=\"#FFFFFF\"><P ALIGN=CENTER>"); printf("<BR>SERVER_NAME = %s", getenv("SERVER_NAME")); printf("<BR>SERVER_SOFTWARE = %s", getenv("SERVER_SOFTWARE")); printf("<BR>REQUEST_METHOD = %s", getenv("REQUEST_METHOD")); printf("<BR>HTTP_REFERED = %s", getenv("HTTP_REFERED")); printf("<BR>SCRIPT_NAME = %s", getenv("SCRIPT_NAME"));

printf("<BR>QUERY_STRING = %s", getenv("QUERY_STRING")); printf("<BR>REMOTE_HOST = %s", getenv("REMOTE_HOST")); printf("</P></BODY></HTML>"); }

Ejecutar

Pgina ASP
<html> <head> <title>Ejemplo de programacin ASP</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <meta name="GENERATOR" content="Microsoft FrontPage 3.0"> </head> <body> <% FOR I =1 TO 5 %> <p>Ejemplo de programacin ASP. Lnea <%=i%><br> <%next%></p> </body> </html>

Ejemplos de CGI
A continuacin se puestra algunos ejemplos de CGIs Programa base para adivinar un nmero (Versin Python)
#!/usr/bin/python import random termine=0 num = random.randint(0,100) while termine==0: x = int(raw_input("Deme un numero ")) if num > x: print "es mas grande" elif num < x: print "es mas pequeno" else: print "Ok" termine=1

Extracto de una pgina HTML para capturar datos (nmero de prueba)


... <form action="adivina.cgi"> Deme un numero: <input name="x"> <input type="submit"> </form> ...

Modificacin del cdigo del juego de adivinar un nmero para trabajar sobre Web (Versin Python) adivina.cgi
#!/usr/bin/python import random import cgi print "Content-Type: text/html\n\n" datos = cgi.FieldStorage() if not datos.has_key("num"): num = random.randint(0,100) else: num = int(datos["num"].value) x = int(datos["x"].value) if num > x: print "es mas grande" elif num < x: print "<font color=\"red\">es mas pequeno</font>" else: print "<h1>Ok</h1>" print """ <form action="adivina.cgi"> Deme un numero: <input name="x"> <input type="hidden" name="num" value="%s"> <input type="submit"> </form> """ % num

Juego de adivinar nmero via Web (Versin Perl)


#!/usr/bin/perl -Tw # Adivinar un numero en PERL $| = 1; use CGI qw(:standard); print header; print start_html('Adivinar un numero (PERL)'); my $form = new CGI; if (!$form->param('numero')) { $numero = int(rand(100)); $intentos = -1; print "Nuevo numero generado<br>"; } else { $numero = int($form->param('numero')); $prueba = int($form->param('prueba')); $intentos = int($form->param('intentos')); if ($prueba == $numero) { print "<b>Adivinado</b> en ".$intentos." intentos<br>"; } else { if ($prueba > $numero) { print "Mas peque<F1>o<br>"; } else { print "Mas grande<br>"; } } } print <<'EOF'; <hr> <form method=post> Numero de prueba: <input name=prueba width=3><br> EOF $intentos+=1; print " <input type=hidden name=numero value=$numero>\n"; print " <input type=hidden name=intentos value=$intentos>\n"; print " <input type=submit><br></form></body></html>"; print end_html;

Ejemplo de uso de CGI con Scheme


#!/bin/sh string=? ; exec /usr/bin/mzscheme -r $0 "$@" (require (lib "cgi.ss" "net")) (display "Content-Type: text/html\n\n") (display "Hola desde DrScheme") (let ((bindings (get-bindings))) (let ((name (extract-binding/single 'name bindings))) (begin (display "<br>Hola ") (display name) ) ) )

JSP
Permite mezclar contenido HTML estndar y esttico con un contenido dinmico generado con java a travs de servlets. Empleando una herramienta para generar una pgina se incorporan instrucciones tipo <% instruccion %>. Las ventajas de emplear JSP (JavaServer Pages) son las de java; que no se restringe a un sistema operativo. Al emplear JSP es ms fcil que emplear servlets. No se requiere definir variables de entorno, sin embargo, al instalarse el intrprete de JSP es necesario agregar las trayectorias correctas a las libreras de JAVA.

Al instalar tomcat por default el atributo WorkPersistent es false. Esto permite que si se agrega una pgina se compila automticamente si ha sufrido cambios. Y slo es necesario invocar la pgina a travs de la direccin URL donde se encuentra el servidor WEB de JSP. Cabe hacer notar que los archivos de JSP son traducidos a servlets.

Existen tres tipos de estructuras en JSP: Elementos de secuencias de comandos es el programa en s; directivas controlan la estructura del servlet yacciones controlan al servidor JSP.

En JSP los comentarios se escriben: <%-comentario --%>.

Elementos de secuencias de comandos hay

tres formas:

1.- Expresiones son <%= expresin %>, que son evaluados y regresan el resultado en String.

2.- Los scriplets del tipo <% cdigo %>, que son instrucciones de java inmersos en un mtodo service.

3.- Las declaraciones del tipo <%! cdigo %> se insertan como atributos de la clase servlet.

Expresiones incorporan valores directamente como:

Dentro de un archivo tipo .htm: La fecha y la hora actual: <%= new java.util.Date() &>

Se tienen algunas variables predefinidas: request, response, session, out.

como: El nombre de su servidor es: <%= request.getRemoteHost() %>

Adicionalmente se puede emplear una sintaxis para expresiones XML por ejemplo para definir atributos:

<jsp:setProperty name="autor" property="nombre" value="Julio" />

<jsp:setProperty name="usuario" property="id" value= '<% "IDUsuario + Math.random() %>' />

Un ejemplo completo:

<html> <head> <title>Expresiones JSP</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head>

<body> <p><font face="Verdana, Arial, Helvetica, sans-serif">Expresiones JSP</font> </p> <p>Fecha y hora del servidor: <%= new java.util.Date() %></p> <p>Nombre de su servidor: <%= request.getRemoteHost() %></p> <p>El par&aacute;metro <code>parametro</code> del formulario: <%= request.getParameter("parametro") %></p> </body> </html>

Los Scriplets tienen la forma <% Codigo de java %> y cuentan con el mismo acceso a las variables request, response, session, out. Asi si desea escribir algo a la salida se emplea out. En los Scriptles puede agregar todo tipo de instrucciones de Java, como ciclos, asignaciones etc. y otras funciones como abrir archivos, actualizar registros de base de datos etc.

Un ejemplo de Scriplet:

<!DOCTYPE HTML PUBLIC "//W3C//DTD HTML 4.01

Transitional//EN"> <html> <head> <title>Scriplets</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">


</head> <% String color = request.getParameter("color"); boolean HayColorDefault; if ( color != null){ HayColorDefault = true; } else { HayColorDefault = false; color = "WHITE"; } %> <body bgcolor="<%= color %>"> Forma que recibe un par&aacute;metro del color. <form name="form2" method="post" action="ScripletFondo.jsp"> <p>Defina el color a enviar ejemplos:</p> <p> #0000FF, #00FF00, #FF00FF</p> <p> <input name="color" type="text" value="<%= color %>"> <input type="submit" name="Submit" value="Enviar"> </p> </form> <% if ( HayColorDefault ){

out.println("El fondo es " + color + "." ); } else{ out.println( "Ha intentado con el color WHITE" ); } %> </body> </html>

Las Declaraciones nos permiten definir mtodos y atributos dentro del servlet equivalente. Hay que establecer que varias ejecuciones del cliente al mismo servlet darn como resultado varios procesos que ejecuten una sola instancia del servlet. Es por esto que los atributos son compartidos por varias peticiones y las variables no tienen que declararse static.

Ejemplo de un JSP empleando una declaracin.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Declaraciones</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head>

<body> <h1>Declaraciones JSP</h1> <%! private int NumAccesos = 0; %> <h2>Nmero de accesos desde el primer acceso a la pgina=<%= ++NumAccesos %></h2>

</body> </html>

Directivas afectan la estructura general del servlet asociado con la pgina JSP. El formato general es:

<%@ directiva atributo1= "valor1" atributo2= "valor2" atributoN= "valorN" %>


Existen tres tipos de directivas; page permite importar clases, include insertar un archivo y taglib para definir etiquetas de marcado.La directiva pagepermite definir los siguientes atributos import, contentType, isThreadSafe, session, buffer, autoflush, extends, info, errorPage, isErrorPage y language.

Ejemplo:

<!DOCTYPE HTML PUBLIC "//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>PageImport</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-88591"> </head> <body> <h2>El atributo Import de Page</h2> <%@ page import="java.util.*" %> <%!

private String numAleatorio() { int num = (int)(Math.random()*10000000.0); return ( "id" + num ); } public class LongLivedCookie extends Cookie { public static final int SECONDS_PER_YEAR = 60*60*24*365; public LongLivedCookie(String name, String value) { super(name, value); setMaxAge(SECONDS_PER_YEAR); } } public static String getCookieValue(Cookie[] cookies, String cookieName, String defaultValue) { if (cookies != null) { for(int i=0; i<cookies.length; i++) { Cookie cookie = cookies[i]; if (cookieName.equals(cookie.getName())) return(cookie.getValue()); } } return(defaultValue);

} private final String SIN_VALOR = "<I>Sin Valor </I>" ; %> <% Cookie[] cookies = String idAnterior = getCookieValue( cookies, "idUsuario", SIN_VALOR); String idNuevo; if (idAnterior.equals(SIN_VALOR) ){ idNuevo = numAleatorio(); } else { idNuevo = idAnterior; } LongLivedCookie cookie = new LongLivedCookie( "idUsuario",idNuevo); response.addCookie(cookie); %> La fecha es <%= new Date() %> con una galleta de <%= idAnterior %> </body> </html>
Si deseamos informar el tipo de informacin enviada al servidor usando el encabezado Content-Type definiendo el tipo MIME del documento se emplear para texto nicamente la directiva:

request.getCookies();

<%@ page contentType="tipo">

Donde tipo puede ser text/plain, text/html, application/msword, application/octet-steam, application/pdf, application/vnd.ma-excel, application/x-java-vm, application/zip, image/gif, image/jpeg, image/x-xbitmap, audio/x-wav, audio/x-aiff, video/mpeg, video/quicktime etc.

El siguiente ejemplo enva una hoja de clculo tipo Excel slo hay que escribir una tabla con los valores en cada celda. Una alternativa a la instruccinpage contentType es la utilizacin dentro de un scriplet de la variable conocida response.setContentType("tipo");

<!DOCTYPE HTML PUBLIC "//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Excel</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-88591"> </head> <body> <%@ page contentType="application/vnd.msexcel" %> <table width="75%" border="1"> <tr> <td>Ganancias Obtenidas</td> <td>A&ntilde;os</td> <td>Valores Reales</td>

<td>Porcentaje</td> <td>Dias Laborados</td> </tr> <tr> <td>2000.99</td> <td>2000-2002</td> <td>4000.95</td> <td>150%</td> <td>710</td> </tr> <tr> <td>3000.70</td> <td>2002-2003</td> <td>90,000</td> <td>175%</td> <td>620</td> </tr> </table> </body> </html>
Para incluir archivos se emplea la instruccin <%@ include file = "URL relativo" %>. Si se modifica un archivo incluido, se tienen que actualizar las fechas de los archivos que lo utilicen.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Documento sin t&iacute;tulo</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head>

<body>

<p>Archivo que incluye a otro.</p> <%@ include file = "cuenta.jsp" %> <p>&nbsp; </p> </body> </html>

El siguiente archivo se llama cuenta.jsp

<%@page contentType="text/html" %> <html> <body> <%! int cuenta=0; private int getCuenta() { //Incrementa cuenta y regresa el valor return ++cuenta;} %> <p>Valores de Cuenta son:</p> <p><%=getCuenta()%></p> <p><%=getCuenta()%></p> <p><%=getCuenta()%></p> <p><%=getCuenta()%></p> </body> </html>

Si se requiere incluir archivos que no contienen JSP, esto es slo html se puede usar la instruccin <jsp:include page = "archivo" flush="true" /> Donde flush es siempre true.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Documento sin t&iacute;tulo</title> <meta http-equiv="Content-Type"

content="text/html; charset=iso-8859-1"> </head>

<body> <p>Archivo que incluye a otros tres</p> <p>&nbsp; </p> <jsp:include page="incluir/inc1.htm" flush="true" /> <p>&nbsp; </p> <jsp:include page="incluir/inc2.htm" flush="true" /> <p>&nbsp; </p> <jsp:include page="incluir/inc3.htm" flush="true" /> </body> </html>

Archivos llamados incx.htm que se encuentran en el subdirectorio incluir.

<p>Esto es los que se muestra en el primer archivo</p>

<p>Este forma parte de un segundo</p>

<p>Y por ltimo se muestra ste archivo</p>

Cuando se usan programas que emplean en applets la librera swing o Java 2D o colecciones no est disponible a menos que dentro de las pginas JSP use en lugar de la instruccin <applet>...</applet> use <jsp:plugin ... </jsp:plugin> que es muy

parecida a applet con la ventaja de poder incluir archivos en java que empleen la plataforma de Java 2.

En el siguiente ejemplo se muestra la instruccin plugin con un ejemplo en swing.

<html> <head> <title> Prueba de Swing </title> </head> <body> pswing.Sw aparecera en un navegador.<br> <jsp:plugin type="applet" codebase = "./" code = "Sw.class" name = "SwingJSP" width = "400" height = "300" hspace = "0" vspace = "0" align = "middle" > <jsp:params> <jsp:param name = "Mensaje" value = "Nada" /> </jsp:params> </jsp:plugin> </body> </html>

Y el siguiente cdigo compilado en java que muestra un ComboBox, un Toggle-Button, un

PasswdField entre otros.

import javax.swing.*; import java.awt.*; import java.awt.event.*; /** * Title: Prueba de Swing * Description: Para probar Swing en un applet con JSP * @author Julio Flores */ public class Sw extends JApplet { String[] Opciones = { "Uno", "Dos", "Tres", "Cuatro", "Cinco" }; String Salto = "\n"; private JPanel jPanel1 = new JPanel(); private BorderLayout borderLayout1 = new BorderLayout(); private JTextArea TA = new JTextArea(); private JPanel Panel = new JPanel(); private JButton BAgregar = new JButton(); private JPasswordField EPassword = new JPasswordField(); private JComboBox CBox = new JComboBox( Opciones ); private JToggleButton TB = new JToggleButton(); public Sw() { try { jbInit();

} catch(Exception e) { e.printStackTrace(); } } private void jbInit() throws Exception { jPanel1.setLayout(borderLayout1); TA.setText("Nada"); BAgregar.setText("<-Agregar"); BAgregar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { BAgregar_actionPerformed(e); } }); EPassword.setText("NoTengoNada"); CBox.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { CBox_actionPerformed(e); } }); TB.setSelected(true); TB.setText("Salto"); TB.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { TB_actionPerformed(e); } }); Panel.add(EPassword, null); Panel.add(BAgregar, null);

Panel.add(CBox, null); Panel.add(TB, null); this.getContentPane().add(jPanel1, BorderLayout.CENTER); jPanel1.add(TA, BorderLayout.CENTER); jPanel1.add(Panel, BorderLayout.SOUTH); } void BAgregar_actionPerformed(ActionEvent e) { TA.append( Salto + new String( EPassword.getPassword() ) ); } void CBox_actionPerformed(ActionEvent e) { TA.append( Salto + CBox.getItemAt( CBox.getSelectedIndex() ) ); } void TB_actionPerformed(ActionEvent e) { if ( TB.isSelected() ) Salto = "\n"; else Salto = " "; } }
Acciones

Ejemplo usando SQL

<!DOCTYPE HTML PUBLIC "-

//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Consultas SQL</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head> <%@ page import="java.sql.*" %> <%@ page import="java.io.*" %> <%! Connection conn = null; StringWriter sw = new StringWriter(); String driver = "com.mysql.jdbc.Driver", url = "jdbc:mysql://localhost/", user = "root", password = ""; public void init() throws ServletException{ try { Class.forName( driver ).newInstance(); conn = DriverManager.getConnection(url, user, password); } catch ( Exception e ) { log("No se abri la conexin", e ); throw new

ServletException("Query: No se inici: "+ e.getMessage(), e ); }; } %> <body> <p>&nbsp;</p> <p><font size="3" face="Verdana, Arial, Helvetica, sansserif">Proporcionar una instrucci&oacute;n sql para obtener el resultado m&aacute;s adelante</font></p> <p>&nbsp;</p> <form name="form1" method="post" action="sql.jsp"> <p>SQL&gt; <input name="query" type="text" id="query" value="" size="90"> </p> <p> <input name="enviar" type="submit" id="enviar" value="Enviar SQL"> </p> </form> <% String query = request.getParameter("query"); if ( query != null )

{ query.trim(); if ( query.length() > 0 ) { out.println("<h1>" + query + "</h1>"); Statement statement = null; try { statement = conn.createStatement(); ResultSet results = statement.executeQuery(query); ResultSetMetaData metadata = results.getMetaData(); int numcols = metadata.getColumnCount(); out.println("<table border=2><tr>"); for(int i = 0; i < numcols; i++) out.print("<th>" + metadata.getColumnLabel(i+1) + "</th>"); out.println("</tr>"); while(results.next()) { out.print("<tr>"); for(int i = 0; i < numcols; i++) out.print("<td>" + results.getObject(i+1) + "</td>"); out.println("</tr>"); } out.println("</table>"); // fin de la tabla

} catch (SQLException e) { out.println("SQL Error: " + e.getMessage()); } finally { // Cerrar el objeto Statement try { statement.close(); } catch(Exception e) {} } } } %> <p>&nbsp; </p> </body> </html>

Estructura de un documento XML

Aunque a primera vista, un documento XML puede parecer similar a HTML, hay una diferencia principal. Un documento XML contiene datos que se autodefinen, exclusivamente. Un documento HTML contiene datos mal definidos, mezclados con elementos de formato. En XML se separa el contenido de la presentacin de forma total.

Una forma de entender rpidamente la estructura de un documento XML, es viendo un pequeo ejemplo:

<?xml version="1.0"?> <!DOCTYPE MENSAJE SYSTEM "mensaje.dtd"> <mensaje>

<remite> <nombre>Alfredo Reino</nombre> <email>alf@ibium.com</email> </remite> <destinatario> <nombre>Bill Clinton</nombre> <email>president@whitehouse.gov</email> </destinatario> <asunto>Hola Bill</asunto> <texto> <parrafo>Hola qu tal? Hace <enfasis>mucho</enfasis> que no escribes. A ver si llamas y quedamos para tomar algo.</parrafo> </texto> </mensaje>

Este mismo documento puede ser visto de forma grfica, para comprender mejor la estructura de un documento XML.

You might also like