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() |
gracias…muy explicativo, pero sabes cómo puedo leer un link con información xml desde java me?, gracias maestro