SAX, DOM y NetBeans

1
57578

XML y Java

En este tutorial os vamos a mostrar como manipular documentos XML desde Java
y NetBeans. Al ser un concepto avanzado, simplemente mostramos como hacerlo
….. la teoría y base tecnológica para usuarios menos avanzados la
publicaremos en otro tutorial.

Los documento XML en Java se manipulan a traves de dos tecnología llamadas
DOM y SAX.

  • Con DOM, creamos un objeto en memoria que representa el documento y
    tenemos los mecanismos para navegar por el …. como si fuera un arbol de
    elementos
  • Con SAX realizamos una pasada por el documento y podemos definir que
    función se va lanzando según voy encontrando distintas etiquetas

Vamos a contruir un sistema que nos va a ayudar a definir el control del
flujo de navegación de mis páginas….. a traves de las ayudas que nos
proporiona NeTBeans … procesamos el documento XML y mostramos su contenido .
Nuestro programa real ….. sería muy parecido a estos pero con lógica
especifica de nuestra problemática …. 

Creamos un documento XML

Creamos automáticamente la DTD (Documento que define la estructura del
documento XML)

Le asignamos un nombre

Ligamos nuestro documento a la DTD

Vemos que el sistema a añadido por nosostros la linea que liga a la DTD

Podemos ver la DTD que se ha creado

DOM

Podemos generar automáticamente un programa que cree un objeto DOM en
memoria, a partir de la DTD.

Asignamos un nombre

Modificando un poquito el programa generado …

import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.*;

public class LectorAccionesDTD {
    /** org.w3c.dom.Document document */
    Document document;

    static void depura(String cadena)
    {
        System.out.println("Mensaje: " + cadena);
    }

    public static void main(String[] parametros)
    {
        try
        {
            DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = builderFactory.newDocumentBuilder();
            Document document = builder.parse (new InputSource("acciones.xml"));
            LectorAccionesDTD scanner = new LectorAccionesDTD (document);
            scanner.visitDocument();
        }
        catch(Exception e)
        {
            depura("Error de procesamiento");
            e.printStackTrace();
        }
    }

    /** Create new LectorAccionesDTD with org.w3c.dom.Document. */
    public LectorAccionesDTD(org.w3c.dom.Document document) {
        this.document = document;
    }

    /** Scan through org.w3c.dom.Document document. */
    public void visitDocument() {
        org.w3c.dom.Element element = document.getDocumentElement();
        if ((element != null) && element.getTagName().equals("acciones")) {
            depura("Visitamos Acciónes");
            visitElement_acciones(element);
        }
    }

    /** Scan through org.w3c.dom.Element named accion. */
    void visitElement_accion(org.w3c.dom.Element element) { // 
        // element.getValue();
        org.w3c.dom.NamedNodeMap attrs = element.getAttributes();
        for (int i = 0; i < attrs.getLength(); i++) {
            org.w3c.dom.Attr attr = (org.w3c.dom.Attr)attrs.item(i);
            if (attr.getName().equals("nombre"))
            { // 
                depura("Nombre Acción: " + attr.getValue());
            }
        }
        org.w3c.dom.NodeList nodes = element.getChildNodes();
        for (int i = 0; i < nodes.getLength(); i++) {
            org.w3c.dom.Node node = nodes.item(i);
            switch (node.getNodeType()) {
                case org.w3c.dom.Node.CDATA_SECTION_NODE:
                    // ((org.w3c.dom.CDATASection)node).getData();
                    break;
                case org.w3c.dom.Node.ELEMENT_NODE:
                    org.w3c.dom.Element nodeElement = (org.w3c.dom.Element)node;
                    if (nodeElement.getTagName().equals("desc")) {
                        visitElement_desc(nodeElement);
                    }
                    if (nodeElement.getTagName().equals("pre")) {
                        visitElement_pre(nodeElement);
                    }
                    break;
                case org.w3c.dom.Node.PROCESSING_INSTRUCTION_NODE:
                    // ((org.w3c.dom.ProcessingInstruction)node).getTarget();
                    // ((org.w3c.dom.ProcessingInstruction)node).getData();
                    break;
            }
        }
    }

    /** Scan through org.w3c.dom.Element named acciones. */
    void visitElement_acciones(org.w3c.dom.Element element) { // 
        // element.getValue();
        org.w3c.dom.NodeList nodes = element.getChildNodes();
        for (int i = 0; i < nodes.getLength(); i++) {
            org.w3c.dom.Node node = nodes.item(i);
            switch (node.getNodeType()) {
                case org.w3c.dom.Node.ELEMENT_NODE:
                    org.w3c.dom.Element nodeElement = (org.w3c.dom.Element)node;
                    if (nodeElement.getTagName().equals("accion")) {
                        visitElement_accion(nodeElement);
                    }
                    break;
            }
        }
    }

    /** Scan through org.w3c.dom.Element named desc. */
    void visitElement_desc(org.w3c.dom.Element element)
    { // 
        org.w3c.dom.NodeList nodes = element.getChildNodes();
        for (int i = 0; i < nodes.getLength(); i++) {
            org.w3c.dom.Node node = nodes.item(i);
            switch (node.getNodeType()) {
               case org.w3c.dom.Node.TEXT_NODE:
                    depura("\tDescripción: " + ((org.w3c.dom.Text)node).getData());
                    break;
            }
        }
    }

    /** Scan through org.w3c.dom.Element named pre. */
    void visitElement_pre(org.w3c.dom.Element element) { // 
        org.w3c.dom.NodeList nodes = element.getChildNodes();
        for (int i = 0; i < nodes.getLength(); i++) {
            org.w3c.dom.Node node = nodes.item(i);
            switch (node.getNodeType()) {
             case org.w3c.dom.Node.TEXT_NODE:
                    // ((org.w3c.dom.Text)node).getData();
                    depura("\tPrecondición: " + ((org.w3c.dom.Text)node).getData());
                    break;
            }
        }
    }
}
    

La salida de este programa es:

Mensaje: Visitamos Acciónes
Mensaje: Nombre Acción: Home
Mensaje:        Descripción: Pagina principal del sistema
Mensaje:        Precondición: all
Mensaje: Nombre Acción: ListarProductos
Mensaje:        Descripción: Listado de distintos productos
Mensaje:        Precondición: Home
Mensaje: Nombre Acción: DesalleProductos
Mensaje:        Descripción: Detalle de los componentes del producto
Mensaje:        Precondición: ListarProductos
Mensaje: Nombre Acción: OrdenarProducto
Mensaje:        Descripción: Ordenar un productos
Mensaje:        Precondición: DesalleProductos
   

En un programa normal …. creariamos el objetos o los objetos más simples
que usariamos en nuestra aplicación

 

SAX

Otra utilidad que nos proporciona NetBeans es la posibilidad de crear un
Parser Sax de nuestro documento

 

Definimos la versión

Definimos el nombre de las funciones SAX

Definimos los tipos de datos de cada area

Generamos en nombre de nuestras clases

Como podemos ver, se ha creado automáticamente el código necesario para
gestionar a traves de un parser SAX nuesto fichero

Modificamos un poquito el código …

Escribimos un main a nuestra clase AccionesDTDParser

    public static void main(String [] array)
    {
        try
        {
            AccionesDTDParser parser = new AccionesDTDParser(new AccionesDTDHandlerImpl(),null);
            parser.parse(new InputSource("acciones.xml"));
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }

    

Y en la clase que implementa las petiticones AccionesDTDHandlerImpl
activamos las trazas

 import org.xml.sax.*;

public class AccionesDTDHandlerImpl implements AccionesDTDHandler {

    public static final boolean DEBUG = true;

    public void start_accion(final AttributeList meta) throws SAXException {
        if (DEBUG) System.err.println("start_accion: " + meta);
    }
    
.....

El resultado es:

start_acciones: org.xml.sax.helpers.XMLReaderAdapter$AttributesAdapter@fe64b9
start_accion: org.xml.sax.helpers.XMLReaderAdapter$AttributesAdapter@fe64b9
handle_desc: Pagina principal del sistema
handle_pre: all
end_accion()
start_accion: org.xml.sax.helpers.XMLReaderAdapter$AttributesAdapter@fe64b9
handle_desc: Listado de distintos productos
handle_pre: Home
end_accion()
start_accion: org.xml.sax.helpers.XMLReaderAdapter$AttributesAdapter@fe64b9
handle_desc: Detalle de los componentes del producto
handle_pre: ListarProductos
end_accion()
start_accion: org.xml.sax.helpers.XMLReaderAdapter$AttributesAdapter@fe64b9
handle_desc: Ordenar un productos
handle_pre: DesalleProductos
end_accion()
end_acciones()    

Sobre el
Autor ..

1 COMENTARIO

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad