Single Tech Games

Pulpcore y Sax, usando XML

Bueno estuve revisando alguna forma de leer XML en java y me di con 2 formas de hacerlo de forma nativa y algunas mas usando parsers, solo hablare de los de forma nativa que son DOM y SAX... bueno tampoco es que vaya a hablar mucho de ellos, solo les dire que la ventaja de SAX es el menor consumo de memoria que DOM pero como desventaja es su dificultad.
Tambien revise algunos parsers pero trato de mantener al minimo el tamaño de los archivos, y estar bajando (y anexando) Xerces o JDom no me convencio del todo, ademas no es que vaya a necesitar tanto de la funcionalidad de los parsers cuando solo voy a leer o escribir XML simples, como los gringos… “keep it simple” aunque SAX no lo es tanto…
Ahora porque digo que SAX es mas rapido, una buena lectura es la de esta pagina, en la parte que dice SAX vs DOM, aunque si googlean un poco pueden encontrar mas informacion. Se fijaran que usan Xerces como parser, pero eso es porque, y esto no lo tengo por seguro, usaban el jdk 1.3, ya que desde la version 1.4 se incluye un parser
Bueno tambien queria indicarles que se puede usar php ademas de java para la escritura y lectura de los archivos XML pero eso lo veremos en otro post (otro mas a la lista “prometi y no cumplo” XD )
Ahora si a lo que vamos, primero decirles que los applets tiene una seguridad propia de ellas que no permiten escribir XML y solo leer archivos desde tu propio servidor, entonces esto quiere decir que si uds corren algun applet sin usar un servidor este simplemente no leera su xml, es por eso que necesitamos primero hacer nuestro servidor y la manera mas facil es o usando apache, o el servidor tomcat de netbeans, io la verdad es que no instale tomcat con netbeans y por eso me baje el servidor apache, concretamente EasyPHP 3.0, porque tambien quiero hacer la prueba con php despues y con un par de “siguientes” tenemos corriendo el apache en 1 seg. Descarguenlo, instalenlo y en la carpeta www (C:\Archivos de programa\EasyPHP 3.0\www, si lo instalaron en esa ruta), copian toda la carpeta build generado en netbeans, en su navegador colocan 127.0.0.1 y veran correr a su applet
Sax lee los archivos XML de forma estructurada a diferencia de Dom que crea objetos, esto hace que Dom consuma mas memoria, es por eso que elegi Sax, lo que no he visto en internet son applets que usen Sax, bueno con pulcore veremos como hacer esto ahora.
Pero y ¿para qué usar XML? bueno imaginense que tenemos un juego y lo queremos tener en varios idiomas, entonces ¿no seria mejor tener toda la traduccion aparte en otro archivo y asi poder agregar varios lenguajes sin ninguna modificacion en el codigo? … yo tambien pensaba lo mismo ^^.
Ok a lo que vamos primero el XML

    Pio Pio
    Juego arcade
        Pollito
        Comer maiz


Ahora el manejador SAX, cabe decirles que para hacer estas clases me base en el ejemplo de lector XML que contienen elementos anidados de Alberto Molpeceres. solo que no uso el parser de xerces sino el que te viene en el jdk

/**
 *
 * @author Julio Cachay
 */
import java.util.Vector;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
public class ManejadorSax {
    private Vector instancias = new Vector();
    private JuegoXMLHandler manejador;
    public ManejadorSax() {
        procesarFichero();
    }
    private void procesarFichero() {
        try {
            XMLReader reader = XMLReaderFactory.createXMLReader();
            manejador = new JuegoXMLHandler(reader, instancias);
            reader.setContentHandler(getManejador());
            reader.parse(new InputSource("http://127.0.0.1/juego.xml"));
            System.out.println("Juego:");
            System.out.println(getManejador().getActual().toString());
            System.out.println("Personaje Principal:");
            System.out.println(getManejador().getHandlerPersonaje().getPersonaje().toString());
        } catch (Exception e) {
            System.out.println("Error al procesar el fichero del juego: " + e.getMessage());
            e.printStackTrace();
        }
    }
    /**
     * @return the manejador
     */
    public JuegoXMLHandler getManejador() {
        return manejador;
    }
}


Ahora los handler, primero el juego

/**
 *
 * @author Julio Cachay
 */
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.Attributes;
import java.util.Vector;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
public class JuegoXMLHandler extends DefaultHandler {
    /* Esto no es nuevo */
    //vector de instancias
    private Vector instancias;
    //"Juego" que se esta procesando
    private Juego actual;
    //valor contenido entre las etiquetas de un elemento
    private String valor;
    /* Esto si es nuevo */
    //Como queremos pasar el control del proceso de un
    //Handler a otro, necesitamos tener el parser para
    //asignarle el Handler que necesite en cada instante.
    private XMLReader parser;
    //Este es el Handler que procesara los personajes que
    //contenga el documento
    private PersonajeXMLHandler handlerPersonaje;
    public JuegoXMLHandler(XMLReader parser, Vector v) {
        this.parser = parser;
        this.instancias = v;
    }
    public void startElement(String namespaceURI, String localName, String qName,
            Attributes attr) throws SAXException {
        //comprobamos si empezamos un elemento "juego"
        if (localName.equals("juego")) {
        //creamos la nueva instancia de Juego
            actual = new Juego();
            //y la añadimos al Vector que las almacena
            instancias.addElement(getActual());
        } else if (localName.equals("personaje-principal")) {
            //creamos una instancia de Personaje
            Personaje principal = new Personaje();
            //se la asignamos al juego actual como principal
            getActual().setPrincipal(principal);
            /*
            y pasamos el control al Handler de personaje principal
            le tenemos que pasar el parser, para que recoga
            los datos del fichero, este Handler para que luego
            nos devuelva el control, y el personaje donde meter
            los datos que procese.
             */
            handlerPersonaje = new PersonajeXMLHandler(parser, this, principal);
            parser.setContentHandler(getHandlerPersonaje());
        }
    }
    public void endElement(String namespaceURI, String localName, String rawName)
            throws SAXException {
        /*
        miramos de que elemento se trata y asignamos los atributos
        correspondientes al "Juego" actual.
         */
        if (localName.equals("nombre")) {
            getActual().setNombre(valor);
        } else if (localName.equals("descripcion")) {
            getActual().setDescripcion(valor);
        }
        valor = null;
    }
    /*
    Los parametros que recibe es la localizacion de los carateres del elemento.
     */
    public void characters(char[] ch, int start, int end) throws SAXException {
    //creamos un String con los caracteres del elemento y le quitamos
    //los espacios en blanco que pueda tener en los extremos.
        valor = new String(ch, start, end);
        valor = valor.trim();
    }
    /**
     * @return the handlerPersonaje
     */
    public PersonajeXMLHandler getHandlerPersonaje() {
        return handlerPersonaje;
    }
    /**
     * @return the actual
     */
    public Juego getActual() {
        return actual;
    }
}


Ahora el personaje

/**
 *
 * @author Julio Cachay
 */
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
public class PersonajeXMLHandler extends DefaultHandler {
    //valor contenido entre las etiquetas de un elemento
    private String valor;
    //El parser, para luego devolver el control al
    //Handler de juego.
    private XMLReader parser;
    //El Handler al que queremos volver
    private JuegoXMLHandler handlerJuego;
    //EL personaje donde meter los datos que leamos.
    private Personaje personaje;
    public PersonajeXMLHandler(XMLReader parser, JuegoXMLHandler handler,
            Personaje personaje) {
        this.parser = parser;
        this.handlerJuego = handler;
        this.personaje = personaje;
    }
    public void endElement(String namespaceURI, String localName, String rawName)
            throws SAXException {
        /*
        miramos de que elemento se trata y asignamos los atributos
        correspondientes a el "Personaje" actual o devolvemos el control
        al Handler de juego.
         */
        if (localName.equals("nombre")) {
            getPersonaje().setNombre(valor);
        } else if (localName.equals("habilidad")) {
            getPersonaje().setHabilidad(valor);
        } //si hemos llegado al final de la etiqueta
        else if (localName.equals("persona-contacto")) {
            parser.setContentHandler(handlerJuego);
        }
        valor = null;
    }
    /*
    Los parametros que recibe es la localizacion de los carateres del elemento.
     */
    public void characters(char[] ch, int start, int end) throws SAXException {
    //creamos un String con los caracteres del elemento y le quitamos
    //los espacios en blanco que pueda tener en los extremos.
        valor = new String(ch, start, end);
        valor = valor.trim();
    }
    /**
     * @return the personaje
     */
    public Personaje getPersonaje() {
        return personaje;
    }
}


Es hora de crear los objetos donde se almacenara la informacion correspondiente, primero Juego

/**
 *
 * @author Julio Cachay
 */
public class Juego {
    private String nombre;
    private String descripcion;
    private Personaje principal;
    public Juego() {
    }
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }
    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }
    public void setPrincipal(Personaje principal) {
        this.principal = principal;
    }
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("   nombre: " + nombre);
        sb.append("   descripcion: " + descripcion);
        return sb.toString();
    }
}


Ahora personaje principal

/**
 *
 * @author Julio Cachay
 */
public class Personaje {
    private String nombre;
    private String habilidad;
    public Personaje() {
    }
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }
    public void setHabilidad(String habilidad) {
        this.habilidad = habilidad;
    }
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("   nombre: " + nombre);
        sb.append("   habilidad: " + habilidad);
        return sb.toString();
    }
}


Con todo esto somos capaces de traer el xml de la ruta 127.0.0.1 que te da apache, recuerden subir el xml a la carpeta www
Es hora de mostrarlo al publico

import pulpcore.scene.Scene2D;
import pulpcore.sprite.FilledSprite;
import pulpcore.sprite.Label;
import static pulpcore.image.Colors.*;
/**
 *
 * @author Julio Cachay
 */
public class Escena extends Scene2D {
    Label juego;
    Label personaje;
    @Override
    public void load() {
        ManejadorSax ms = new ManejadorSax();
        add(new FilledSprite(rgb(185, 209, 255)));
        juego = new Label("Juego: " + ms.getManejador().getActual().toString(), 20, 120);
        personaje = new Label("Personaje Principal: " + ms.getManejador().getHandlerPersonaje().getPersonaje().toString(), 20, 320);
        add(juego);
        add(personaje);
    }
}


Listo! ya terminamos todo, el resultado se vera asi
dibujo
Recuerden que pueden ver como quedo y bajarse el codigo desde mi pagina aqui

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments