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!