El API JAXP

Hasta ahora, hemos comprendido la estructura de nodos que componen un DOM. Un DOM realmente es muy f�cil de crear. Esta secci�n del tutorial DOM nos va a llevar mucho menos trabajo que nada de lo que hemos visto hasta ahora.

.�Obtener un DOM desde un Factor�a

En esta versi�n de la aplicaci�n tambi�n vamos a crear una nueva factor�a constructora de documentos, pero esta vez le vamos a decir que cree un nuevo DOM en lugar de analizar un documento XML existente. Dejaremos todas las funcionalidades existentes intactas, y a�adiremos la nueva funcionalidad en forma de interruptor para poder volver al comportamiento de analizador.

Note:

El c�digo de est� secci�n es DomEcho05.java.

.�Modificar el C�digo

Empezamos desactivando la caracter�sitica de compresi�n. Como vamos a trabajar con el DOM en esta secci�n, queremos ver todos los nodos.

public class DomEcho05  extends JPanel
{
    ...
    boolean compress = true;
    boolean compress = false;

Luego, necesitamos crear un m�todo buildDom que cree el objeto document. La forma m�s f�cil de hacer esto es crear el m�todo y copiar la secci�n de construcci�n del DOM desde el m�todo main para crear el buildDom. Las modificaciones mostradas abajo muestran los cambios que necesitamos hacer en el c�digo del m�todo buildDom:

public class DomEcho05  extends JPanel
{
    ...
    public static void makeFrame() {
        ...
    }
    public static void buildDom ()
    {
        DocumentBuilderFactory factory = 
			DocumentBuilderFactory.newInstance();
        try {
          DocumentBuilder builder = factory.newDocumentBuilder();
          document = builder.parse( new File(argv[0]) );
          document = builder.newDocument();  // Create from whole cloth

        } catch (SAXParseException spe) {
           ...

        } catch (SAXException sxe) {
           ...

        } catch (ParserConfigurationException pce) {
            // Parser with specified options can't be built
            pce.printStackTrace();

        } catch (IOException ioe) {
           ...
        }
    }

En este c�digo, reemplazamos la l�nea que hace el an�lisis con una que crea el DOM. Luego, como el c�digo no va a analizar un fichero existente, eliminamos las excepciones que ya no se lanzar�n: SAXParseException, SAXException, y IOException.

Finalmente, como vamos a trabajar con objetos Element, a�adimos la sentencia para importar la clase al principo del programa.

import org.w3c.dom.Document;
import org.w3c.dom.DOMException;
import org.w3c.dom.Element;

.�Crear Nodos Element y Text

Ahora, para nuestro primer experimento, a�adimos las operaciones Document para crear un nodo ra�z y varios hijos.

public class DomEcho05  extends JPanel
{
    ...
    public static void buildDom ()
    {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        try {
          DocumentBuilder builder = factory.newDocumentBuilder();
          document = builder.newDocument();  // Create from whole cloth

          Element root = 
                  (Element) document.createElement("rootElement"); 
          document.appendChild (root);
          root.appendChild( document.createTextNode("Some") );
          root.appendChild( document.createTextNode(" ")    );
          root.appendChild( document.createTextNode("text") );

        } catch (ParserConfigurationException pce) {
            // Parser with specified options can't be built
            pce.printStackTrace();
        }
    }

Finalmente, modificamos el c�digo de chequeo de la lista de argumentos de la parte superior del m�todo main para inovocar a nuestros buildDom y makeFrame en lugar de generar un error.

public class DomEcho05  extends JPanel
{
    ...
    public static void main (String argv [])
    {
        if (argv.length != 1) {
            System.err.println ("Usage: java DomEcho filename");
            System.exit (1);
            buildDom();
            makeFrame();
            return;
        } 

Si suministramos un argumento especificando un fichero, �ste ser� analizado, si no lo hacemos, se ejecutar� el c�digo experimental que construye el DOM.

.�Ejecutar la Aplicaci�n

Compilamos y ejecutamos el programa sin argumentos y veremos el resultado de la figura 1.

.Normalizar el DOM

En este experimento, manipularemos el DOM que hemos creado normaliz�ndolo despu�s de haberlo construido.

Nota:

El c�digo de est� secci�n es DomEcho06.java.

A�adimos el c�digo en negrita de abajo, para normalizar el DOM:

    public static void buildDom ()
    {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        try {
          ...
          root.appendChild( document.createTextNode("Some") );
          root.appendChild( document.createTextNode(" ")    );
          root.appendChild( document.createTextNode("text") );

          document.getDocumentElement().normalize();

        } catch (ParserConfigurationException pce) {
            ...

En este c�digo, getDocumentElement devuelve el nodo ra�z del documento, y la operaci�n normalize manipula el arbol.

Cuando compilamos y ejecutamos la aplicaci�n, el resultado se parece al de la figura 2.

Aqu� podemos ver que los nodos de texto adyacentes han sido combinados en un s�lo nodo. La operaci�n de normalizaci�n es una que normalmente queremos hacer despu�s de hacer modifiaciones a un DOM, para asegurarnos que el DOM resultante es tan compacto como sea posible.

Nota:

Ahora que tenemos este programa para experimentar con �l, pudes ver que sucede con otras combinaciones de CDATA, referencias de entidad, y nodos de texto cuando los normalizas.

.�Otras Operaciones

Para completar esta secci�n, echaremos un r�pido vistazo a otras operaciones que podr�amos querer aplicar a un DOM, incluyendo:

  • Mover Nodos
  • Crear Atributos
  • Eliminar Nodos

.�Mover Nodos

El interface Node define un n�mero de m�todos que podemos usar para mover nodos, incluyendo getFirstChild, getLastChild, getNextSibling, getPreviousSibling, y getParentNode. Estas operaciones son suficientes para obtener algo de una posici�n del �rbol y ponerlo en otra.

.�Crear Atributos

El interface org.w3c.dom.Element, que extiende Node, define una operaci�n setAttribute que a�ade un atributo a un nodo.

Tambi�n podemos usar la operaci�n createAttribute de Document para crear un ejemplar del Attribute, y usar una versi�n sobrecargada de setAttribute para a�adirlo.

.�Eliminar y Cambiar Nodos

Para eleminar un nodo, usamos el m�todo removeChild de su padre. Para cambiarlo, o usamos la operaci�n replaceChild de su padre o su propia operaci�n setNodeValue.

.�Finalizando

�Felicidades! Has aprendido c�mo est� estructurado un DOM y c�mo manipularlo. Ahora tienes una aplicaci�n DomEcho que puedes usar para mostrar la estructura de un DOM, dondensarlo en dimensiones compatibles GUI, y experimentar para ver como afectan a la estructura las distintas operaciones. �Diviertete con ella!

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR

SIGUIENTE ARTÍCULO