java y xml sesión 4 · 2010. 7. 30. · java y xml copyright © 2002-2003 universidad de alicante...

43
Java y XML Copyright © 2002-2003 Universidad de Alicante J2EE-1 Java y XML Sesión 4: DOM

Upload: others

Post on 12-Feb-2021

17 views

Category:

Documents


0 download

TRANSCRIPT

  • 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