Menú Curso XML,XSL,XMLRPC/SOAP : Código Fuente programa procesando XML vía DOM.

(Anterior) DOM, SAX y JDOM

El siguiente ejemplo al igual que el anterior de SAX esta basado en el parser Xerces 2.0, sin embargo, también se hace uso de las librerías JAXP por lo que puede ser ejecutado en otro parser Java sin complicaciones.

Dentro de este programa se define una función llamada imprimirnodos, esta función actúa de una forma recursiva, esto significa que dentro de la misma función vuelve a ser llamada, lo anterior va en acorde con el comportamiento de árbol en DOM.

  En base a su ambiente abra un Editor  de Textos 
  para generar el siguiente ejemplo.

Clase ArbolDOM

package com.osmosislatina.xml.dom;

// Librerías de I/O 
import java.io.*;

// Librerías de DOM 
import org.w3c.dom.*;

// Clases JAXP 
import javax.xml.parsers.DocumentBuilderFactory;  
import javax.xml.parsers.DocumentBuilder;  
import javax.xml.parsers.ParserConfigurationException;

// Clases SAX 
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;

public class ArbolDOM  {
 


    //
    // Programa Principal 
    //

    // Variables 
    static Document document; 
    protected static PrintWriter out;

    /**  Inicio Programa Principal  */
    public static void main (String args [])
    {
        // Revisar que exista un archivo de entrada 
        if (args.length != 1) {
            System.err.println ("Debe indicar un archivo XML para ser procesado");
            System.exit (1);
        }

	// Crear la fabrica utilizada para DOM

        DocumentBuilderFactory factory =
           DocumentBuilderFactory.newInstance();
        try {
	    // Generar el Stream para enviar a Pantalla
	    out = new PrintWriter (System.out);

	    // Procesar archivo 
           DocumentBuilder builder = factory.newDocumentBuilder();

           // Definir un ErrorHandler (Estilo SAX) para atrapar Errores.
           builder.setErrorHandler(

		 // Definir Clase Interna para Control de Errores 
                 new org.xml.sax.ErrorHandler() {

                 // Ignorar Errores Fatales
                 public void fatalError(SAXParseException exception)
                    throws SAXException {
                 }

                 // Tratar errores de Validacion
             public void error(SAXParseException e) throws SAXParseException
                 {
                   throw e;
                 }

                // Tratar avisos a Consola
                public void warning(SAXParseException err) throws SAXParseException
                 {
                    System.out.println("** Warning"
		    + ", line " + err.getLineNumber()
                    + ", uri " + err.getSystemId());
                    System.out.println("   " + err.getMessage());
                 }
              }
           ); 

	   // Iniciar Proceso de "Parse"
           document = builder.parse( new File(args[0]) );

	   ArbolDOM writer = new ArbolDOM();
	   writer.imprimirNodos(document);

	} catch (ParserConfigurationException pexc) { 
	    pexc.printStackTrace();
        } catch (Exception exc) {
           System.out.println("   " + exc.getMessage() );

	}
    }

A continuación se describe el método de impresión y un método auxiliar utilizado para ordenar los atributos de cada elemento.



    public void imprimirNodos(Node node) {

        // Si ya no existen nodos por Imprimir salir.....
        if ( node == null ) {
            return;
        }

	/** Investigar el Tipo de Nodo */

        int type = node.getNodeType();

	/** En base al Tipo de Nodo ejecutar */
        switch ( type ) {

	    // Imprimir Documento 
        case Node.DOCUMENT_NODE: {
             NodeList children = node.getChildNodes();
             for ( int iChild = 0; iChild < children.getLength(); iChild++ ) {
                    imprimirNodos(children.item(iChild));
             }
             out.flush();
             break;
	}

	// Imprimir elementos con atributos
        case Node.ELEMENT_NODE: {
                out.print('<');
                out.print(node.getNodeName());
                Attr attrs[] = sortAttributes(node.getAttributes());
                for ( int i = 0; i < attrs.length; i++ ) {
                    Attr attr = attrs[i];
                    out.print(' ');
                    out.print(attr.getNodeName());
                    out.print("=\"");
                    out.print(attr.getNodeValue());
                    out.print('"');
                }
                out.print('>');
                NodeList children = node.getChildNodes();
                if ( children != null ) {
                    int len = children.getLength();
                    for ( int i = 0; i < len; i++ ) {
                        imprimirNodos(children.item(i));
                    }
                }
                break;
            }

            // Imprimir Texto 
        case Node.TEXT_NODE: {
	    out.print(node.getNodeValue());
	    break;
	}

            // Imprimir Nodos con Instrucciones de Proceso 
        case Node.PROCESSING_INSTRUCTION_NODE: {
                out.print("<?");
                out.print(node.getNodeName());
                String data = node.getNodeValue();
                if ( data != null && data.length() > 0 ) {
                    out.print(' ');
                    out.print(data);
                }
                out.println("?>");
                break;
	}

           // Imprimir Texto de Elementos CDATA
        case Node.CDATA_SECTION_NODE: {
	    out.print(node.getNodeValue());
	    break;
	}

        } // Termina Switch

        // En caso de ser nodo de Elemento cerrar Tag en Pantalla 
        if ( type == Node.ELEMENT_NODE ) {
            out.print("</");
            out.print(node.getNodeName());
            out.print('>');
        }

	// Enviar a Pantalla Buffer
        out.flush();

    } // Termina Impresion de Nodos 
 
    /** Funcion utilizada para Ordenar Atributos de Elementos */

    protected Attr[] sortAttributes(NamedNodeMap attrs) {

        int len = (attrs != null) ? attrs.getLength() : 0;
        Attr array[] = new Attr[len];
        for ( int i = 0; i < len; i++ ) {
            array[i] = (Attr)attrs.item(i);
        }
        for ( int i = 0; i < len - 1; i++ ) {
            String name  = array[i].getNodeName();
            int    index = i;
            for ( int j = i + 1; j < len; j++ ) {
                String curName = array[j].getNodeName();
                if ( curName.compareTo(name) < 0 ) {
                    name  = curName;
                    index = j;
                }
            }
            if ( index != i ) {
                Attr temp    = array[i];
                array[i]     = array[index];
                array[index] = temp;
            }
        }

        return(array);

    } // Terminar ordenar de Atributos 

}

Terminos Legales de Contenido ©2000-2008 Osmosis Latina

Diseñado bajo estándares : XHTML   CSS  

webmaster@osmosislatina.com