Post on 12-Feb-2021
Java y XML Copyright © 2002-2003 Universidad de Alicante J2EE-1
Java y XMLSesión 4:
DOM
Java y XML Copyright © 2002-2003 Universidad de Alicante J2EE-2
INDICE
DefiniciónEspecificaciones DOMDOM Level 1DOM Level 2Analizadores DOM para JavaNavegación en un documento DOMManipulación de un documento DOMCreación de un documento DOM
Java y XML Copyright © 2002-2003 Universidad de Alicante J2EE-3
INDICE
DefiniciónEspecificaciones DOMDOM Level 1DOM Level 2Analizadores DOM para JavaNavegación en un documento DOMManipulación de un documento DOMCreación de un documento DOM
Java y XML Copyright © 2002-2003 Universidad de Alicante J2EE-4
Definición
DOM: Document Object ModelEs una especificación de un API, independiente del lenguaje, para acceder y modificar documentos XML (y HTML)Diferencias con SAX:
Acceso no secuencial a informaciónPermite alterar la información
Está siendo desarrollado por el W3C (World Wide Web Consortium)
Java y XML Copyright © 2002-2003 Universidad de Alicante J2EE-5
INDICE
DefiniciónEspecificaciones DOMDOM Level 1DOM Level 2Analizadores DOM para JavaNavegación en un documento DOMManipulación de un documento DOMCreación de un documento DOM
Java y XML Copyright © 2002-2003 Universidad de Alicante J2EE-6
Especificaciones DOM
DOM Level 1 (Core y HTML)Proporciona interfaces para representar y manipular la estructura de documentos y su contenidoInterfaces fundamentales: DOMException, DOMImplementation, DocumentFragment, Document, Node, NodeList, NamedNodeMap, CharacterData, Attr, Element, Text, Comment
DOM Level 2 Core, HTML, views, events, traversal and rangeAñade facilidades para gestionar eventos y hojas de estilo, para recorrer el árbol y para gestionar un rango
DOM Level 3Core, load and save, validation, XPATHAñade funcionalidades para cargar ficheros XML y convertirlos enrepresentación DOM y viceversa, validar el árbol y acceder a él mediante XPATH 1.0
Java y XML Copyright © 2002-2003 Universidad de Alicante J2EE-7
INDICE
DefiniciónEspecificaciones DOMDOM Level 1DOM Level 2Analizadores DOM para JavaNavegación en un documento DOMManipulación de un documento DOMCreación de un documento DOM
Java y XML Copyright © 2002-2003 Universidad de Alicante J2EE-8
Dom Level 1: Interfaz Document
Representa el documento HTML o XML. Conceptualmente es la raiz del árbol y proporciona acceso primario a los datos del documentoContiene los métodos factory necesarios para crear los elementos del árbol. Los objetos Node creados tienen un atributo ownerDocument que los asocia con el Document en cuyo contexto fueron creadosAtributos:
doctype, implementation, documentElement
Métodos:createElement , createDocumentFragment...
Java y XML Copyright © 2002-2003 Universidad de Alicante J2EE-9
Dom Level 1: Tipos Node
DocumentDocumentFragmentDocumentTypeEntityReferenceElementAttrProcessingInstruction
CommentTextCDATASectionEntityNotation
Los nodos Text existen bajo cualquier nodo Element en una representacion DOM. Los datos siempre se almacenan en nodos Text.
Java y XML Copyright © 2002-2003 Universidad de Alicante J2EE-10
Representación DOM de un documento XML
El modelo lógico DOM se asemeja a un árbol (o bosque)DOM representa los documentos como una jerarquía de objetos Node. Algunos tipos de nodos pueden tener hijos, otros son nodos hoja
Gato Perro
Boa Lagarto
Modelo DOM asociado
Java y XML Copyright © 2002-2003 Universidad de Alicante J2EE-11
Posibles nodos hijo de nodos Node
--Notation
Element, ProcessingInstruction, Comment, Text, CDATASection, EntityReferenceEntity
--CDATASection
--Text
--Comment
--ProcessingInstruction
Text, EntityReferenceAttr
Element, Text, Comment, ProcessingInstruction, CDATASection, EntityReferenceElement
Element, ProcessingInstruction, Comment, Text, CDATASection, EntityReferenceEntityReference
--DocumentType
Element, ProcessingInstruction, Comment, Text, CDATASection, EntityReferenceDocumentFragment
Element (=1), ProcessingInstruction, Comment, DocumentTypeDocument
Posibles nodos hijoTipos Node
Java y XML Copyright © 2002-2003 Universidad de Alicante J2EE-12
Atributos de nodos Node
12nullnombre de la notacióndeclarada en el DTDNotation
6nullnombre de la entidadEntity
4contenido de la sección CDATA#cdata-sectionCDATASection
3contenido de nodo t ext#textText
8contenido del comentario#commentComment
7contenido íntegro exceptuando el targ etdestino (targ et)ProcessingInstruction
2valor del atributonombre del atributoAttr
1nullnombre de la etiquetaElement
5nullnombre de la entidadreferenciadaEntityReference
10nullnombre del tipo de documentoDocumentType
11null#document fragmentDocumentFragment
9null#documentDocument
nodeTypevaluenameTipos Node
Java y XML Copyright © 2002-2003 Universidad de Alicante J2EE-13
Jerarquía de objetos Node
Cada tipo de nodo puede tener como posibles hijos a nodos de un cierto tipo
P. ej. un nodo de tipo Document puede tener como posibles hijos: Element (>=1), ProcessingInstruction, Comment, DocumentType
Los nodos de tipo Attr y Entity NO pueden aparecer como hijos de ningún otro objeto Node.El método getAttributes( ) de la interfaz Node (sobre nodos Element) se usa para obtener los atributos de una etiqueta xmlEl método getEntities( ) de la interfaz Node (sobre nodos DocType) se usa para obtener las entidades de la especificación DTD
Java y XML Copyright © 2002-2003 Universidad de Alicante J2EE-14
Ejemplo 1
Esto es una muy buena idea.
Jerarquía de nodos DOM:+element: frase
++text: Esto es una++element: bold
+++text: muy buena++text: idea.
node.getNodeName()devuelve el nombre del nodonode.getNodeValue()devuelve el valor del nodonode.getNodeType()devuelve el tipo de nodo (es una constante)node.getChildNodes()devuelve una lista de subnodos
cada nodo elementcontiene un nodo
text seguido de un subelemento y de
otro nodo text.
getNodeName( ) = "frase"getNodeValue( ) = null
getNodeName( ) = "#text"getNodeValue( ) = "Esto es una"
Java y XML Copyright © 2002-2003 Universidad de Alicante J2EE-15
Ejemplo 2
Java y XML Copyright © 2002-2003 Universidad de Alicante J2EE-16
INDICE
DefiniciónEspecificaciones DOMDOM Level 1DOM Level 2Analizadores DOM para JavaNavegación en un documento DOMManipulación de un documento DOMCreación de un documento DOM
Java y XML Copyright © 2002-2003 Universidad de Alicante J2EE-17
Dom Level 2 (DOM2)
Está dividido en 14 módulos distribuidos en 8 paquetes (DOM1 se corresponde con los módulos Core y XML)
Core (org.w3c.dom)
XML (org.w3c.dom)
HTML (org.w3c.dom.html)
Views (org.w3c.dom.views)StyleSheets (org.w3c.dom.stylesheets)
CSS (org.w3c.dom.css)
CSS2 (org.w3c.dom.css)
Events (org.w3c.dom.events)
UIEvents (org.w3c.dom.events)
MouseEvents (org.w3c.dom.events)MutationEvents (org.w3c.dom.events)HTMLEvents (org.w3c.dom.events)Traversal (org.w3c.dom.traversal)Range (org.w3c.dom.range)
Java y XML Copyright © 2002-2003 Universidad de Alicante J2EE-18
INDICE
DefiniciónEspecificaciones DOMDOM Level 1DOM Level 2Analizadores DOM para JavaNavegación en un documento DOMManipulación de un documento DOMCreación de un documento DOM
Java y XML Copyright © 2002-2003 Universidad de Alicante J2EE-19
Analizadores DOM para Java
Las funciones para: Crear un documentoAnalizar un documentoSerializar un documento en un fichero o flujo de datos
Son realizadas pon un PARSER (NO están especificadas en DOM2)Ejemplos parsers: Crimson, Serces, XML for Java, OracleXML parser for Java, GNU JAXPJAXP es un API de Java para procesamiento de XML
Proporciona formas estándar (independientes del analizador) paraanalizar documentos, crear nuevos documentos y serializar documentos
Java y XML Copyright © 2002-2003 Universidad de Alicante J2EE-20
Proceso de análisis con JAXP
Obtener un objeto DocumentBuilderFactoryObtener una instancia del analizador (DocumentBuilder)
Por defecto javax.xml.parsers.DocumentBuilderFactoryO también en el fichero lib/jaxp.properties (del directorio jre)
Usar algún método parse() para leer el documento XML y devolver un objeto Document
Java y XML Copyright © 2002-2003 Universidad de Alicante J2EE-21
Ejemplo: XML-DOM
//importar los paquetes necesariospublic class DomEcho{ static Document document;
public static void main (String argv[ ]){
if (argv.length != 1) {... }DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try {DocumentBuilder builder = factory.newDocumentBuilder();document = builder.parse (new File (argv[0]));
} catch (...) { //captura de excepciones }
} }
imports
excepciones
instancia del analizador
obtenemos el "builderFactory"
analizamos el documento
Java y XML Copyright © 2002-2003 Universidad de Alicante J2EE-22
Ejemplo: XML-DOM imports
import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.FactoryConfigurationError;import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.SAXException;import org.xml.sax.SAXParseException;
import java.io.File;import java.io.IOException;
import org.w3c.dom.Document;import org.w3c.dom.DOMException;
JAXP APIs
excepciones cuando el documento es analizado
excepciones cuando se lee el fichero XML
documento DOM y excepciones DOM
Java y XML Copyright © 2002-2003 Universidad de Alicante J2EE-23
Ejemplo: XML-DOM excepciones
catch (SAXException sxe) {Exception x = sxe;if (sxe.getException(!= null)
x = sxe.getException();x.printStackTrace(); }
catch (ParserConfigurationException pce) {pce.printStackTrace(); }
catch (IOException ioe) {ioe.printStackTrace(); }
error generado durante el análisis
el parser no puede construirse
errores de E/S
Java y XML Copyright © 2002-2003 Universidad de Alicante J2EE-24
INDICE
DefiniciónEspecificaciones DOMDOM Level 1DOM Level 2Analizadores DOM para JavaNavegación en un documento DOMManipulación de un documento DOMCreación de un documento DOM
Java y XML Copyright © 2002-2003 Universidad de Alicante J2EE-25
Navegación en documentos DOM
Para navegar por las estructuras del árbol DOM (org.w3c.dom.Node):getFirstChild, getLastChild, getNextSibling, getPreviousSibling, getParentNode
Ejemplo: Recorrido en preorden de un árbol:import javax.xml.parsers.*; // JAXPimport org.w3c.dom.Node;import org.xml.sax.SAXException;import java.io.IOException;public class TreeReporter {
public static void main(String[] args) {
if (args.length
Java y XML Copyright © 2002-2003 Universidad de Alicante J2EE-26
Navegación en documentos DOM
catch (SAXException e) {System.out.println(args[0] + " is not well-formed.");System.out.println(e.getMessage());
} catch (IOException e) {
System.out.println(e); }catch (ParserConfigurationException e) {
System.out.println("Could not locate a JAXP parser"); }
} // end main
private PropertyPrinter printer = newPropertyPrinter();
// note use of recursionpublic void followNode(Node node) throws
IOException {printer.writeNode(node);if (node.hasChildNodes()) {
Node firstChild = node.getFirstChild();followNode(firstChild);
}Node nextNode = node.getNextSibling();if (nextNode != null) followNode(nextNode);
}}
Java y XML Copyright © 2002-2003 Universidad de Alicante J2EE-27
Búsqueda de un nodo
public Node findSubNode(String name, Node node) {if (node.getNodeType() != Node.ELEMENT_NODE) {System.err.println("Error: El nodo buscado no es de tipo element");System.exit(22);
} //ifif (! node.hasChildNodes()) return null;NodeList list = node.getChildNodes();for (int i=0; i < list.getLength(); i++) {Node subnode = list.item(i);if (subnode.getNodeType() == Node.ELEMENT_NODE) {
if (subnode.getNodeName() == name) return subnode;} //if
} //forreturn null;
} //findSubNode
Java y XML Copyright © 2002-2003 Universidad de Alicante J2EE-28
Obtención del contenido de un nodo
public String getText(Node node) {StringBuffer result = new StringBuffer();if (! node.hasChildNodes()) return "";
NodeList list = node.getChildNodes();for (int i=0; i < list.getLength(); i++) {Node subnode = list.item(i);if (subnode.getNodeType() == Node.TEXT_NODE) {
result.append(subnode.getNodeValue()); }else if (subnode.getNodeType() == Node.CDATA_SECTION_NODE) {
result.append(subnode.getNodeValue()); }else if (subnode.getNodeType() == Node.ENTITY_REFERENCE_NODE) {
result.append(getText(subnode));}
} //forreturn result.toString();
}
Java y XML Copyright © 2002-2003 Universidad de Alicante J2EE-29
INDICE
DefiniciónEspecificaciones DOMDOM Level 1DOM Level 2Analizadores DOM para JavaNavegación en un documento DOMManipulación de un documento DOMCreación de un documento DOM
Java y XML Copyright © 2002-2003 Universidad de Alicante J2EE-30
Manipulación de documentos DOM
createElement( "nombreElemento")Crea un objeto Node de tipo elementPara crear otros objetos Node se utiliza createTextNode( ), etc.Cuando creamos un nuevo nodo Element, el único dato que especificamos es su nombre
appendChild( )Para añadir un nodo hijo, primero debemos crear el nodo
removeChild( )Para eliminar un nodo debemos situarnos sobre su "padre"
replaceChild( ) o también setNodeValue( )Para cambiar un nodo debemos situarnos sobre su nodo "padre"
insertBefore( )Para insertar un nodo debemos situarnos sobre su nodo "padre"
Java y XML Copyright © 2002-2003 Universidad de Alicante J2EE-31
Serialización de un documento DOM
javax.xml.transform permite serializar un documento DOM:
Obtener un objeto TransformerFactoryObtener una instancia TransformerConstruir un nuevo objeto DOMSource a partir de un Document (input)Construir un objeto StreamResultconectado al OutputStream deseado (output)Utilizar transform( ) sobre los objetos original y resultante (input y output)
TransformerFactory
TransformerSourceSource ResultResult
Transformationinstructions
Java y XML Copyright © 2002-2003 Universidad de Alicante J2EE-32
Ejemplo: clase Restructurer (I)
public class Restructurer {
public static void processNode(Node current) throws DOMException{
Node nextSibling = current.getNextSibling();int nodeType = current.getNodeType();
if (nodeType == Node.COMMENT_NODE ||nodeType == Node.PROCESSING_INSTRUCTION_NODE) {
Node document = current.getOwnerDocument();Node root = document.getFirstChild();while (!(root.getNodeType() == Node.ELEMENT_NODE)) {
root = root.getNextSibling();}
buscamos el nodo raíz
reordena los nodos del árbol de forma que las instrucciones queden por encima de la raíz y los comentarios aparezcan debajo de la raíz
Java y XML Copyright © 2002-2003 Universidad de Alicante J2EE-33
Ejemplo: clase Restructurer (II)
Node parent = current.getParentNode();parent.removeChild(current);if (nodeType == Node.COMMENT_NODE) {
document.appendChild(current); }else if (nodetype == Node.PROCESSING_INSTRUCTION_NODE) {
document.insertBefore(current,root); }} //si no es un comentario ni una instrucción de procesamientoelse if (current.hasChildNodes()) {
Node firstChild = current.getFirstChild();processNode(firstChild);
}if (nextSibling != null) {
processNode(nextSibling); }} //fin processNode
} //fin Restructurer
las instrucciones quedan por encima del nodo raíz
los comentarios quedan por debajo del nodo raíz
seguimos buscando por debajo de current
buscamos entre los hermanos de current
Java y XML Copyright © 2002-2003 Universidad de Alicante J2EE-34
Ejemplo: clase RestructureDriver (I)
public class RestructureDriver {
public static void main(String[] args) { if (args.lenght
Java y XML Copyright © 2002-2003 Universidad de Alicante J2EE-35
Ejemplo: clase RestructureDriver (II)
TransformerFactory xformFactory = TransformerFactory.newInstance();Transformer idTransform = xformFactory.newTransformer();Source input = new DOMSource(document);Result output = new StreamResult(System.out);idTransform.transform(input,output);
}catch (...) {
//captura de excepciones}
}}
escritura del documento resultante
Java y XML Copyright © 2002-2003 Universidad de Alicante J2EE-36
INDICE
DefiniciónEspecificaciones DOMDOM Level 1DOM Level 2Analizadores DOM para JavaNavegación en un documento DOMManipulación de un documento DOMCreación de un documento DOM
Java y XML Copyright © 2002-2003 Universidad de Alicante J2EE-37
Creación de documentos DOM
Utilizando newDocument( ) desde el parserUtilizando la interfaz DomImplementation:
Localizar una clase DOMImplementation localCrear un nuevo objeto Document
• public Document createDocument (String rootElementNamespaceURI, String rootElementQualifiedName, DocumentType doctype);
Añadir varios tipos de nodos al objeto DocumentSerializar el objeto Document en un Stream
Es preferible utilizar la interfaz DomImplementation
puede utilizarse null puede utilizarse null
Java y XML Copyright © 2002-2003 Universidad de Alicante J2EE-38
Ejemplo: Crear un DOM con newDocument( )(I)
//importar los paquetes necesariospublic class DomEcho{ static Document document;
public static void buildDOM ( ){ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try {DocumentBuilder builder = factory.newDocumentBuilder();document = builder.newDocument ( );
//añadimos elementos
document.getDocumentElement().normalize();} catch (...)
{ //captura de excepciones }}
imports
excepciones
creamos el documento
obtenemos el "builderFactory"
normalizamos el documento
añadir elementos
instancia del analizador
Java y XML Copyright © 2002-2003 Universidad de Alicante J2EE-39
Ejemplo: Crear un DOM con newDocument( )(II)
public static void main (String argv [ ] ){
if (argv.length != 1) {buildDom();return;
}} }
import org.w3c.dom.Document;import org.w3c.dom.DOMException;import org.w3c.dom.Element;
construimos un nuevo DOM
imports
Java y XML Copyright © 2002-2003 Universidad de Alicante J2EE-40
Ejemplo: Crear un DOM con newDocument( )(III)
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) {pce.printStackTrace();
}
añadir elementos
excepciones
el parser no puede construirse
Java y XML Copyright © 2002-2003 Universidad de Alicante J2EE-41
Ejemplo: Crear un DOM con DomImplementation(I)
//importar los paquetes necesariospublic class FibonacciDOM{ public static void main (String [ ] args)
try {DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();factory.setNamespaceAware(true);
DocumentBuilder builder = factory.newDocumentBuilder();
DOMImplementation impl = builder.getDOMImplementation();
Document doc = impl.createDocument (null, "Fibonacci_Numbers", null);
BigInteger low = BigInteger.ONE;BigInteger high = BigInteger.ONE;
imports
DOMImplementation local
obtenemos el "builderFactory"
creamos el documento
instancia del analizador
Java y XML Copyright © 2002-2003 Universidad de Alicante J2EE-42
Ejemplo: Crear un DOM con DomImplementation(II)
Element root = doc.getDocumentElement();
for (int i = 0; i < 10; i++) {Text space = doc.createTextNode("\n ");root.appendChild(space);Element number = doc.createElement("fibonacci");Text text = doc.createTextNode(low.toString());number.appendChild(text);root.appendChild(number);BigInteger temp = high;high = high.add(low);low = temp;
}Text lineBreak = doc.createTextNode("\n");root.appendChild(lineBreak);
añadimos los nodos en el árbol
Java y XML Copyright © 2002-2003 Universidad de Alicante J2EE-43
Ejemplo: Crear un DOM con DomImplementation(III)
serializamos el documento
TransformerFactory xformFactory = TransformerFactory.newInstance(); Transformer idTransform = xformFactory.newTransformer();Source input = new DOMSource(doc);Result output = new StreamResult(System.out);idTransform.transform(input, output);
}catch (...) {
//captura de excepciones }
} //fin main} //fin FibonacciDOM
imports
import org.w3c.dom.Document;import org.w3c.dom.DOMException;import org.w3c.dom.Element;import org.w3c.dom.DOMImplementation;import javax.xml.transform.*;
INDICEINDICEDefiniciónINDICEEspecificaciones DOMINDICEDom Level 1: Interfaz DocumentDom Level 1: Tipos NodeRepresentación DOM de un documento XMLPosibles nodos hijo de nodos NodeAtributos de nodos NodeJerarquía de objetos NodeEjemplo 1Ejemplo 2INDICEDom Level 2 (DOM2)INDICEAnalizadores DOM para JavaProceso de análisis con JAXPEjemplo: XML-DOMEjemplo: XML-DOMEjemplo: XML-DOMINDICENavegación en documentos DOMNavegación en documentos DOMBúsqueda de un nodoObtención del contenido de un nodoINDICEManipulación de documentos DOMSerialización de un documento DOMEjemplo: clase Restructurer (I)Ejemplo: clase Restructurer (II)Ejemplo: clase RestructureDriver (I)Ejemplo: clase RestructureDriver (II)INDICECreación de documentos DOMEjemplo: Crear un DOM con newDocument( )Ejemplo: Crear un DOM con newDocument( )Ejemplo: Crear un DOM con newDocument( )Ejemplo: Crear un DOM con DomImplementationEjemplo: Crear un DOM con DomImplementationEjemplo: Crear un DOM con DomImplementation