Saltar la navegación

6.4.- DOM.

DOM  (Document Object Model ) es una recomendación oficial del World Wide Web Consortium (W3C). Define una interfaz que permite a los programas acceder y actualizar el estilo, la estructura y el contenido de los documentos XML. Los analizadores XML compatibles con DOM implementan esta interfaz.

El estándar W3C define la especificación de la clase DocumentBuilder con el propósito de poder instanciar estructuras DOM a partir de un XML . La clase DocumentBuilder es una clase abstracta, y para que se pueda adaptar a las diferentes plataformas, puede necesitar fuentes de datos o requerimientos diversos. Recuerda que las clases abstractas no se pueden instanciar de forma directa. Por este motivo, el consorcio W3 especifica también la clase DocumentBuilderFactory

Las instrucciones necesarias para leer un archivo XML y crear un objeto Documento serían las siguientes: 

DocumentBuilderFactory dbFactory = DocumentBuilderFactory. newInstance 
DocumentBuilder dBuilder = dbFactory. newDocumentBuilder ;
Document doc = dBuilder. parse ( new File ( "fitxer.xml" ) ) ;

La escritura de la información contenida en el DOM se puede secuenciar en forma de texto utilizando otra utilidad de Java llamada Transformer . Se trata de una utilidad que permite realizar fácilmente conversiones entre diferentes representaciones de información jerárquica. Es capaz, por ejemplo, de pasar la información contenida en un objeto Documento a un archivo de texto en formato XML . También sería capaz de hacer la operación inversa, pero el mismo DocumentBuilder ya se encarga de ello. 

Transformer es también una clase abstracta y requiere de una fábrica para poder ser instanciada. La clase Transformer puede trabajar con multitud de contenedores de información porque en realidad trabaja con un par de tipos adaptadores (clases que hacen compatibles jerarquías diferentes) que se llaman Source y Result. Las clases que implementen estas interfaces se encargarán de hacer compatible un tipo de contenedor específico al requerimiento de la clase Transformer . Así, disponemos de las clases DOMSource, SAXSource o StreamSorce como adaptadores del contenedor de la fuente de información ( DOM, SAX o Stream respectivamente). DOMResult, SAXResult o StreamResult son los adaptadores equivalentes del contenedor destino.

El código básico para realizar una transformación de DOM archivo de texto XML sería el siguiente:

// Creación de una instancia Transformer
Transformer trans = TransformerFactory. newInstance . newTransformer ;
// Creación de los adaptadores Source y Results a partir de un Documento 
// y un File.
StreamResult result =  new StreamResult ( file ) ;
DOMSource source =  new DOMSource ( doc ) ;
trans.transform ( source, result ) ;

Con el fin de rebajar la complejidad, vamos a crear una clase que llamaremos XmlCtrlDomcon utilidades genéricas que nos simplifiquen el traspaso de archivos XML a DOM o viceversa.

public  class XmlCtrlDom {
    public  static  Document instanciarDocument 
        throws ParserConfigurationException {
        Document doc = null ;
        doc = DocumentBuilderFactory. newInstance . newDocumentBuilder . newDocument ;
        return doc ;
    }
    public  static  void escriureDocumentATextXml ( Document doc, File file )
      throws TransformerException {
        Transformer trans = TransformerFactory. newInstance . newTransformer ;
        trans.setOutputProperty ( OutputKeys. indent , "yes" ) ;
        StreamResult result =  new StreamResult ( file ) ;
        DOMSource source =  new DOMSource ( doc ) ;
        trans. transform ( source, result ) ;
      }
    public  static  Document instanciarDocument ( File fXmlFile ) 
                              throws ParserConfigurationException,
                                     SAXException, 
                                     IOException {
        Document doc = null ;
        doc = DocumentBuilderFactory. newInstance.newDocumentBuilder . parse ( fXmlFile ) ;
        doc. getDocumentElement.normalize ;
        return doc ; 
    }
    ...
}