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 ;
}
...
}