Cómo trabajar con el Document Object Model (DOM) en XML


El Modelo de Objetos del Documento (DOM, por sus siglas en inglés) es el método más antiguo y, sin lugar a dudas, el más fácil para trabajar con documentos XML en general. Microsoft XML Core Services 4.0 (MSXML2) proporciona un competente analizador DOM que cumple o extiende todas las recomendaciones del W3C para un analizador de nivel 3 del DOM. El problema es que la documentación incluida con la biblioteca, sinceramente, deja mucho que desear. Navegar a través de las numerosas clases COM no es para los débiles de corazón, y la información sobre las tareas más triviales se pasa por alto.


Índice de Contenido
  1. Jugando al catch-up con XML
  2. Tres tareas básicas al utilizar un analizador DOM
    1. ¿Qué DOMDocument debo usar?
  3. Movimiento en un documento
  4. Creación de un nuevo documento XML
  5. Creando un nuevo libro
  6. Continuará...

Jugando al catch-up con XML

Consulta la serie "XML Remedial" de Builder.com para obtener más información sobre la sintaxis XML, DTD, esquemas y análisis con DOM y SAX. Tenemos una versión descargable conveniente de toda la serie aquí.


Tres tareas básicas al utilizar un analizador DOM

Con un analizador DOM, realizarás tres tareas básicas: leer un documento existente, editar un documento existente y crear un nuevo documento. Es probable que también te preocupe validar un documento de alguna manera. He creado una aplicación de ejemplo en VB6 llamada BookEditor, que demuestra el uso del analizador DOM de MSXML para crear y llenar un nuevo documento XML que se parecerá al archivo XML del catálogo de libros utilizado a lo largo de mi serie "XML Remedial". Puedes descargar el código de esta aplicación de muestra aquí.

¿Qué DOMDocument debo usar?

El analizador DOM en sí se implementa en un objeto DOMDocument, que también representa la raíz última del árbol DOM. Desafortunadamente, se pueden encontrar no menos de cuatro objetos DOMDocument en la biblioteca MSXML2, un estado de asuntos confuso. La razón de Microsoft para crear tantos objetos de documento está más allá del alcance de este artículo (tiene que ver con la compatibilidad con versiones anteriores y los ProgIDs de COM). Por lo tanto, digamos simplemente que DOMDocument40 representa la última versión de DOMDocument y es la que utilizaremos en este artículo.

Todos los elementos encontrados en un documento se organizan en nodos secundarios del objeto documento, que también expone una serie de métodos de fábrica utilizados para crear los diferentes tipos de nodos con los que trabajarás al moverte por un documento. IXMLDOMNode es la clase base para todas las variedades de nodos que utilizarás al trabajar con un documento XML. Los tipos de nodos con los que debes preocuparte aparecen en la Figura A.

Nodo del objetoDOMDocument40 Método de fábricaUso
IXMLDOMNodecreateNode()Clase base para todos los tipos de nodos del árbol.
IXMLDOMElementcreateElement()Representa un elemento XML (par de etiquetas).
IXMLDOMAttributecreateAttribute()Representa un atributo.
IXMLDOMProcessingInstructioncreateProcessingInstruction()Representa una instrucción de procesamiento, como la declaración de versión XML.

Algunos tipos clave de nodos

Apache Jakarta Commons Lang: Centraliza tus funciones de utilidad en Java

Movimiento en un documento

La clase base IXMLDOMNode expone métodos que se pueden utilizar para moverse dentro del árbol de un documento. Las propiedades firstChild y lastChild devuelven una instancia de los primeros y últimos nodos encontrados bajo el nodo actual. A partir de ahí, puedes moverte al siguiente o anterior nodo hermano de ese nodo secundario utilizando las propiedades nextSibling y previousSibling. Comprueba la propiedad nodeType para determinar qué tipo de nodo es el nodo actual. Si es un elemento, puedes acceder al valor que contiene utilizando la propiedad nodeValue.

También puedes acceder a los hijos de un nodo a través de una colección IXMLDOMNodeList, que se recupera utilizando la propiedad childNodes de una instancia de un nodo. IXMLDOMNodeList es una colección indexada; es decir, puedes recuperar cualquier nodo secundario de un nodo a través de su índice numérico basado en cero.


Creación de un nuevo documento XML

La aplicación de ejemplo BookEditor permite al usuario crear un nuevo documento XML basado en los valores ingresados para un libro hipotético. El control TreeView en Form1 muestra el contenido del catálogo de libros cargado actualmente, como se puede ver en la Figura B.

Cómo trabajar con el Document Object Model (DOM) en XML - Desarrollo | Imagen 1 Newsmatic

BookEditor muestra tres libros

Lo primero que hace BookEditor al iniciar es inicializar un nuevo documento XML en blanco para utilizarlo como raíz para agregar nuevos elementos de libro al árbol del documento. Esto se hace dentro de la subrutina SetupCatalogDoc, que se muestra en la Listado A.

Antes de crear nodos, configuro el analizador DOM estableciendo algunas propiedades del objeto CatalogDocDOMDocument40 a nivel de módulo:

Cómo instalar y utilizar Java Web Start para desplegar aplicaciones Java
  • El atributo async controla si el analizador funciona en modo síncrono. El modo asíncrono (por defecto) permite que tu aplicación realice otras tareas mientras el analizador DOM construye el árbol de nodos para un documento grande. Dado que mi aplicación de demostración trabaja con documentos relativamente pequeños, configuro el analizador en modo síncrono (false) para eliminar la complejidad involucrada en el seguimiento del progreso de un análisis asíncrono.
  • El atributo preserveWhiteSpace controla si el analizador inserta elementos adicionales en el árbol DOM para representar el espacio en blanco en un documento XML. Estos elementos adicionales pueden complicar la navegación por los nodos, por lo que desactivé esta función estableciendo la propiedad en false.
  • El atributo resolveExternals controla si el analizador intenta cargar documentos externos o espacios de nombres referenciados encontrados en el documento XML. Esta función resulta útil cuando trabajas con un documento que tiene un esquema XML o DTD asociado: establecer resolveExternals en true hace que el analizador cargue automáticamente un esquema o DTD para validar el documento posteriormente.

Con el analizador configurado como deseo, puedo empezar a crear los nodos necesarios para formar la raíz del nuevo documento. Primero, creo un nuevo nodo IXMLProcessingInstruction para representar la declaración de versión XML que debe aparecer al comienzo de cualquier documento XML. Luego, creo un nodo IXMLElementNode para representar el elemento raíz del catálogo llamado "catalog". Después de agregar ambos nodos a CatalogDoc, tengo el siguiente documento XML simple (verifica la propiedad CatalogDoc.xml para verificar esto):

<?xml version="1.0"?>
<catalog/>

Creando un nuevo libro

Ahora que CatalogDoc está configurado con un elemento raíz, el usuario puede agregar un nuevo libro haciendo clic en el botón Nuevo libro. Revisa las rutinas cmdNew_Click y BuildNewBookNodes en el Listado B para ver esto en acción.

Primero, creo un nuevo elemento book utilizando CatalogDoc.createElement y lo anexo al elemento raíz catalog (al que se accede mediante la propiedad documentElement de CatalogDoc). Luego, creo un nuevo nodo IXMLDOMAttribute para contener el atributo id del libro que el usuario está a punto de agregar. En este caso, solo cuento el número actual de libros en el documento (que incluye el nuevo elemento book que acabamos de agregar) y anexo ese número al texto "bk." Una llamada a BuildNewBookNodes añade los elementos title, author, price, publish_date, genre y description vacíos, por lo que el documento XML ahora se ve así:

<?xml version="1.0"?>
<catalog>
  <book id="bk1">
    <author></author>
    <title></title>
    <genre></genre>
    <price></price>
    <publish_date></publish_date>
    <description></description>
  </book>
</catalog>

El elemento book recién creado se pasa a Form2 a través de una variable pública y se muestra el formulario de edición (ver Figura C). Cuando el usuario termine de ingresar información sobre el nuevo libro y haga clic en OK, inserto los datos del formulario en los subelementos adecuados de book recorriendo su árbol de nodos secundarios. Consulta el Listado C para ver el controlador de eventos cmdOK_Click donde esto ocurre.

Cómo trabajar con el Document Object Model (DOM) en XML - Desarrollo | Imagen 2 Newsmatic

Agregar un nuevo libro al catálogo

Finalmente, nos queda con un documento XML que se ve así (una vez más, verifica CatalogDoc.xml para verificar esto):

Cómo utilizar un Iterador de filtrado para optimizar el procesamiento de objetos en Java
<?xml version="1.0"?>
<catalog>
  <book id="bk1">
    <author>Lamont Adams</author>
    <title>Lamont's First Book</title>
    <genre>Fantasía</genre>
    <price>10.00</price>
    <publish_date>2005-11-05</publish_date>
    <description>Es fantasía hasta que realmente lo escriba</description>
  </book>
</catalog>

Continuará...

Hemos creado con éxito un nuevo documento DOM y hemos agregado algunos datos con la aplicación BookEditor. Sin embargo, apenas hemos rasgado la superficie, ya que todavía queda mucho por hacer: BookEditor necesita permitir a los usuarios guardar y cargar archivos XML y validar un documento en memoria contra un esquema. Te mostraré cómo hacer todo esto, y un poco más, en un próximo artículo.

En Newsmatic nos especializamos en tecnología de vanguardia, contamos con los artículos mas novedosos sobre Desarrollo, allí encontraras muchos artículos similares a Cómo trabajar con el Document Object Model (DOM) en XML , tenemos lo ultimo en tecnología 2023.

Artículos Relacionados

Subir

Utilizamos cookies para mejorar su experiencia de navegación, mostrarle anuncios o contenidos personalizados y analizar nuestro tráfico. Al hacer clic en “Aceptar todo” usted da su consentimiento a nuestro uso de las cookies.