Академический Документы
Профессиональный Документы
Культура Документы
qxd
17/12/04
01:06
Pgina 36
MIDDLEWARE
XML define
datos portables
y Python define
el cdigo fuente
SOLO PROGRAMADORES n 121
36
XML
En las prximas lneas vamos a hacer un repaso de la
tecnologa XML, aunque este tema ha sido tratado
con profundidad en ediciones anteriores de Slo
Programadores. Si el lector quiere ampliar lo aqu
expuesto, puede consultar los nmeros 110, 111, 114,
115 y 116.
XML no es slo un lenguaje de lenguajes, es tambin
un conjunto de tecnologas que permiten su representacin y procesamiento, tales como XPath, XLink,
XPointer o XML. La especificacin de XML 1.0 puede
encontrarse en la direccin de Internet
http://www.w3.org/TR/REC-xml. Un documento XML
est estructurado en los siguientes componentes:
z Instrucciones de procesamiento (processing
instructions PI). Las PI son instrucciones para
el procesador del documento XML. El prlogo
del documento es una PI obligatoria:
<?xml version=1.0 encoding=iso-8859-1?>
z
A travs del DTD una instancia de un documento puede ser validada contra la gramtica
que define los elementos y posicin de los mismos en un documento.
Comentarios. Sirven para realizar anotaciones
tiles al autor del documento. Un ejemplo sera:
<! Esto es un comentario >
Python 121.qxd
17/12/04
01:06
Pgina 37
MIDDLEWARE
Procesamiento XML
La popularidad de XML estriba en no tener que
crear un nuevo compilador por cada lenguaje de
representacin de datos que queremos disear.
Las herramientas que llevan a cabo la validacin
lxica y sintctica de los documentos y su transformacin en una representacin manejable por
programas vienen ya dados. A cambio, los diseadores de nuevos tipos de documentos XML
slo deben seguir las restricciones que un documento XML bien formado debe cumplir:
z Debe tener un prlogo.
z Debe tener una etiqueta (elemento) raz.
z Las etiquetas se hallan correctamente
anidadas.
z Se usan caracteres vlidos y bien aplicados.
z Los valores de los atributos vienen encerrados entre comillas.
La industria utiliza tres estndares principales para el procesamiento de documentos
XML: SAX, DOM y XSL. A continuacin, pasamos a describirlos en ms detalle.
Python 121.qxd
17/12/04
01:06
Pgina 38
MIDDLEWARE
LISTADO 1
peliAttribs.getNamedItem(codigo).
Documento Cartelera.xml
nodeValue
cin correspondiente
a las pelculas encontradas en el mismo. El
mtodo DOM principal que se utiliza es
getElementsByTag
Name(<nombre-elemento>), que dado el
nombre de un elemento recupera todas
Figura 1. Ejecucin del programa ElementCounterSAX.py
las instancias del
aplicado a Cartelera.xml.
mismo encontradas
to al entrar en una parte significativa del docu- en un rbol DOM. El atributo de un elemento
mento. El listado 2 muestra un ejemplo de DOM attributes se usa para recuperar los atricdigo Python que procesa el fichero butos de cada elemento pelcula. Las sentenCartelera.xml para contar el nmero de ele- cias en la forma:
mentos y atributos XML encontrados en l.
LISTADO 2
Procesamiento del fichero Cartelera.xml usando SAX
Tanto el documento XML (Cartelera.xml) como
el script Python (ElementCounterSAX.py) estn
# Uso: python ElementCounterSAX.py Cartelera.xml
disponibles en el CD-ROM que acompaa a la
import sys
from xml.sax import make_parser, handler
revista. La figura 1 muestra el resultado de la
class ElementCounter(handler.ContentHandler):
ejecucin de este script.
def __init__(self):
38
self._elems = 0
self._attrs = 0
self._elem_types = {}
self._attr_types = {}
def startElement(self, name, attrs):
self._elems = self._elems + 1
self._attrs = self._attrs + len(attrs)
self._elem_types[name] = self._elem_types.get(name, 0) + 1
for name in attrs.keys():
self._attr_types[name] = self._attr_types.get(name, 0) + 1
def endDocument(self):
print There were, self._elems, elements.
print There were, self._attrs, attributes.
print -ELEMENT TYPES
for pair in self._elem_types.items():
print %20s %d % pair
print -ATTRIBUTE TYPES
for pair in self._attr_types.items():
print %20s %d % pair
parser = make_parser()
parser.setContentHandler(ElementCounter())
parser.parse(sys.argv[1])
Python 121.qxd
17/12/04
01:06
Pgina 39
MIDDLEWARE
LISTADO 3
#!/usr/bin/env python
# -*- coding: iso-8859-1 -*import xml.dom.minidom, sys
class Pelicula:
def __init__(self, codigo, titulo, director, actores):
self.codigo = codigo
self.titulo = titulo
self.director = director
self.actores = actores
def __repr__(self):
return Codigo: + str(self.codigo) + - titulo: + self.titulo +
- director: + self.director + - actores: + self.actores
class PeliculaDOMParser:
def __init__(self, filename):
self.dom = xml.dom.minidom.parse(filename)
self.peliculas = []
def getPeliculas(self):
# Si no hemos ya recuperado las pelculas en el documento ...
if not self.peliculas:
peliculaNodes = self.dom.getElementsByTagName(Pelicula)
numPelis = len(peliculaNodes)
for i in range(numPelis):
pelicula = peliculaNodes.item(i)
# Recuperar los attributes de cada nodo Pelicula
peliAttribs = pelicula.attributes
codigo = peliAttribs.getNamedItem(codigo).nodeValue
titulo = peliAttribs.getNamedItem(titulo).nodeValue
director = peliAttribs.getNamedItem(director).nodeValue
actores = peliAttribs.getNamedItem(actores).nodeValue
# crear un nuevo objeto de tipo pelcula
self.peliculas.append(Pelicula(codigo,titulo,director,actores))
return self.peliculas
if __name__ == __main__:
domParser = PeliculaDOMParser(sys.argv[1])
for peli in domParser.getPeliculas():
print peli
LISTADO 4
integra de manera transparente con la plataforma Java. Jython complementa a Java y es especialmente indicada para las siguientes tareas:
z Empotrar scripts en aplicaciones Java, de
modo que los usuarios finales puedan escribir scripts que aadan funcionalidad a la
aplicacin.
z Experimentacin interactiva por medio del
intrprete interactivo suministrado por
Jython que permite interactuar con los
paquetes Java o aplicaciones en ejecucin.
z Desarrollo rpido de aplicaciones. Los programas en Python son tpicamente entre 2
y 10 veces ms cortos que los programas
Java. Esto se traduce en una mayor productividad en la programacin. La integracin
transparente de Jython y Java permite
combinar estos dos lenguajes en productos.
Existen otros lenguajes de scripting que se
integran transparentemente con Java como
Jacl, implementacin en Java de Tcl, Rhino,
implementacin en Java de JavasScript o
BeanShell. Sin embargo Jython se distingue de
otras alternativas por:
z Compilacin dinmica de Jython en bytecodes de Java (conduce al mayor rendimiento posible).
z Habilidad para extender las clases Java en
Jython.
z Compilacin esttica opcional, que permite la creacin de applets, servlets y beans.
Lo hace a travs de la herramienta jythonc
que transforma ficheros .PY en .CLASS.
z Uso del lenguaje Python que combina
poder con simplicidad sintctica, soportando el modelo orientado a objetos de Java.
Las herramientas de compilacin/ejecucin de
Jython son disponibles en http://www.
jython.org/download.html. Para instalarlo simplemente hay que ejecutar el comando java jython21, que lanzar el instalador de Jython. Como
prerrequisito, la mquina donde se instale debe
tener preinstalada una mquina virtual de Java. Si
no se dispone de ella, puede ser obtenida desde
http://java.sun.com/j2se/1.4.2/download.html.
Programacin en Jython
Jython bsico
Jython (http://www.jython.org) es una implementacin Open Source en Java de Python que se
39
Python 121.qxd
17/12/04
01:06
Pgina 40
MIDDLEWARE
Nuestra implementacin
original de Tres en Raya en
modo texto, a la que llamamos tresenraya.py, requiere mnimos cambios
para ser ejecutable en
Jython. Tan solo debemos
aadir dos variables globales True y False con los
valores 1 y 0, respectiva3. Pgina web resultante de aplicar Cartelera.xsl a
mente. Esto es debido a que Figura
Cartelera.xml.
Jython no soporta todava
el tipo booleano de Python. Hemos incluido la ver- listado 6 muestra el constructor de la clase
sin modificada de este script en el CD-ROM bajo JuegoTresEnRayaJythonGUI, incluida en el CDel nombre tresenrayajython.py. Las dos nicas ROM bajo el nombre tresenrayajythongui.py,
Transformando la aplicacin Tres
lneas que difieren del script original presentado en junto con la implementacin del mtodo
la primera entrega de este curso son:
onClick. La lgica principal de esta aplicacin
en Raya en una aplicacin Jython
est gobernada por el mtodo jugar no incluido
True = 1
Qu mejor manera de evaluar el potencial de
por falta de espacio pero disponible tambin en el
False = 0
Jython que retomar nuestra conocida aplicacin
CD-ROM. La clase JuegoTresEnRayaJythonGUI
del Tres en Raya y aplicar los cambios requeridos La ejecucin de este script Jython se presen- hereda de tresenrayajython.JuegoTresEnRaya,
para poderla ejecutar en Jython. Vamos a dividir ta en la figura 5.
que es la clase base del juego. En el constructor de
esta tarea de transformacin en tres fases:
Tres en Raya modo grfico en Jython
esta clase: (1) se obtiene una instancia a la imple1.- Tres en Raya modo texto en Jython.
El siguiente paso en la transformacin del juego mentacin de la clase del registro de jugadores
2.- Tres en Raya modo grfico en Jython Tres en Raya en Jython es crear la interfaz grfica que guarda datos en un mapa persistente, (2) se
con acceso a mapa persistente.
del mismo usando el paquete Swing de Java. El invoca al constructor de la clase base y (3) luego
simplemente se crea un Frame donde se coloLISTADO 5
Fragmento hoja de estilo Cartelera.xsl
can los botones correspondientes a las casillas del
tablero de tres en raya.
<?xml version=1.0 encoding=iso-8859-1?>
Obsrvese lo sencillo que es en Jython asig<xsl:stylesheet xmlns:xsl=http://www.w3.org/1999/XSL/Transform version=1.0>
<xsl:output method=html/>
nar un manejador de eventos a un botn:
<xsl:template match=/>
<html>
<head>
<style type=text/css>
table {font-family: arial, sans serif; margin-left: 15pt;}
th,td {font-size: 80%;}
th {background-color:#FAEBD7}
</style>
</head>
<body>
<table border=1>
<xsl:apply-templates/>
</table>
</body>
</html>
</xsl:template>
<xsl:template match=Cartelera>
<xsl:for-each select=Cine>
<tr>
<th><xsl:text>Cine</xsl:text></th>
<th><xsl:text>Direccin</xsl:text></th>
<th><xsl:text>Poblacin</xsl:text></th>
<th></th>
</tr>
...
</xsl:stylesheet>
40
button = swing.JButton(self.icono
Vacio, actionPerformed=self.onClick)
Python 121.qxd
17/12/04
01:06
Pgina 41
MIDDLEWARE
LISTADO 6
IronPython: Python
para .NET
import java
from java import awt
from javax import swing
from javax.swing import
...
class JuegoTresEnRayaJythonGUI(tresenrayajython.JuegoTresEnRaya):
def __init__(self):
registro = tresenrayajython.RegistroJugadoresPersistente()
tresenrayajython.JuegoTresEnRaya.__init__(self, registro, solop, solop)
self.frame = swing.JFrame(Juego Tres en Raya,
visible=1, windowClosing=self.exit)
gridSizer = awt.GridLayout(3,3)
self.frame.getContentPane().setLayout(gridSizer)
self.iconoMaquina = swing.ImageIcon(Images\\x.PNG)
self.iconoUsuario = swing.ImageIcon(Images\\o.PNG)
self.iconoVacio = swing.ImageIcon(Images\\blank.PNG)
self.buttons = []
for i in range(9):
button = swing.JButton(self.iconoVacio, actionPerformed=self.onClick)
button.setBackground(awt.Color.WHITE)
self.frame.contentPane.add(button)
self.buttons.append(button)
self.frame.pack()
...
El algoritmo MiniMax
No quera concluir esta serie sobre Python, en la
que el juego Tres en Raya nos ha ayudado a
entender tantos conceptos, sin proponer un algoritmo ms sofisticado referente a la eleccin de
casillas por la mquina. En definitiva, muchos de
vosotros os habris preguntado cmo hacer que
la mquina piense y elija la mejor casilla en cada
momento. Este razonamiento es posible a travs
del algoritmo de inteligencia artificial, MiniMax.
41
Python 121.qxd
17/12/04
01:06
Pgina 42
MIDDLEWARE
LISTADO 7
Clase RegistroJugadoresDBJython.py
42
Conclusiones
Aqu acabamos nuestro recorrido por el lenguaje de programacin Python. Confo que a
lo largo de estas cuatro entregas el lector haya
podido descubrir el potencial de este gran lenguaje de scripting que combina a la vez potencia y sencillez. La aplicacin de tres en raya
que hemos ido desarrollando tan solo ha mostrado cmo implementar en Python la funcionalidad correspondiente a las tareas programticas ms tpicas: programacin grfica, de
acceso a bases de datos, web y XML. Por falta
de tiempo no hemos podido descubrir otras
muchas reas en las que Python tambin
juega un papel destacado. Espero que, tras lo
descrito en esta serie, el poder de Python os
acompae en vuestras prximas tareas de
programacin.