Estás en:

informaciónDESARROLLADO POR:
icono_twiter icono_linkedin icono_linkedin icono_xing

Creador y propietario de AdictosAlTrabajo.com, Director General de Autentia S.L., Ingeniero Técnico de Telecomunicaciones y Executive MBA por el Instituto de Empresa 2007. Twitter: @rcanalesmora

Autor del Libro: Informática profesional, las reglas no escritas para triunfar en la empresa

Puedes consultar mi CV y alguna de mis primeras aplicaciones (de los 90) aquí

Fecha de publicación del tutorial: 2003-06-28
Tutorial visitado 41.967 veces41.967
Descargar el tutorial en PDF


Regístrate para votar
Share |

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 ..

Anímate y coméntanos lo que pienses sobre este TUTORIAL:

Puedes opinar o comentar cualquier sugerencia que quieras comunicarnos sobre este tutorial; con tu ayuda, podemos ofrecerte un mejor servicio.


(Sólo para usuarios registrados)

» Registrate y accede a esta y otras ventajas «

Comentarios

  1. 2010-08-10 - 01:35:09
    optimux

    gracias...muy explicativo, pero sabes cómo puedo leer un link con información xml desde java me?, gracias maestro

  1. waldo
    2009-06-22 - 02:32:38 AM

    Me ha servido de mucho.... muchas gracias...

  2. que te importa
    2006-12-15 - 01:01:15 AM

    Es un aco este pinche tutorial si se le puede decir tutorial, esta madre no trae nada interesante cuando publiquen algo q sea bueno por favor si no evitense poner estas pendejadas

  3. Enrique Jopia
    2006-11-05 - 06:52:58 PM

    Hola oy estudiante de ing. civil en informatica de la Usach en Santiago de Chile... vi tu tutorial y lo encontre bueno, aunque te recomiendo que pongas los archivos XML para descargar porque tuve que tomarme el tiempo de escribirlos...

  4. Nestor I. Leon N.
    2006-06-05 - 10:53:41 PM

    esta muy bien el tutorial gracias por publicarlo me sirvio de mucho