Procesamiento de XML con DOM

1. ¿Qué es DOM?

DOM (Document Object Model) es una representación en memoria de un documento XML como un árbol de nodos.

  • Cada etiqueta, atributo y texto del XML se convierte en un nodo dentro de ese árbol.
  • Permite leer, modificar, agregar o eliminar partes del documento.

DOM carga todo el archivo XML completo en memoria, lo que lo hace muy práctico para manipular documentos pequeños o medianos.

2. Ejemplo de documento XML

<?xml version="1.0" encoding="UTF-8"?>
<biblioteca>
    <libro id="1">
        <titulo>1984</titulo>
        <autor>George Orwell</autor>
    </libro>
    <libro id="2">
        <titulo>Don Quijote</titulo>
        <autor>Miguel de Cervantes</autor>
    </libro>
</biblioteca>

Representación en árbol DOM:

biblioteca
  libro (id=1)
      titulo = "1984"
      autor = "George Orwell"
  libro (id=2)
      titulo = "Don Quijote"
      autor = "Miguel de Cervantes"

3. Operaciones comunes con DOM

  • Leer elementos y atributos.
  • Modificar valores.
  • Agregar o eliminar nodos.
  • Guardar nuevamente el XML en un archivo.

4. Procesamiento de XML con DOM en distintos lenguajes

a) Python (xml.dom.minidom)

from xml.dom import minidom

# Abrir y parsear el archivo
doc = minidom.parse("biblioteca.xml")

# Obtener todos los elementos <libro>
libros = doc.getElementsByTagName("libro")

for libro in libros:
    id_libro = libro.getAttribute("id")
    titulo = libro.getElementsByTagName("titulo")[0].firstChild.data
    autor = libro.getElementsByTagName("autor")[0].firstChild.data
    print(f"Libro {id_libro}: {titulo} - {autor}")

# Modificar un valor
libros[0].getElementsByTagName("titulo")[0].firstChild.data = "Mil novecientos ochenta y cuatro"

# Guardar cambios
with open("biblioteca_modificada.xml", "w", encoding="utf-8") as f:
    f.write(doc.toxml())

Este código carga el XML, recorre los elementos <libro>, imprime título y autor, modifica el título del primer libro y guarda un nuevo archivo.

b) Java (javax.xml.parsers + org.w3c.dom)

import javax.xml.parsers.*;
import org.w3c.dom.*;
import java.io.*;

public class LeerXML {
    public static void main(String[] args) throws Exception {
        File archivo = new File("biblioteca.xml");
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(archivo);
        doc.getDocumentElement().normalize();

        NodeList listaLibros = doc.getElementsByTagName("libro");

        for (int i = 0; i < listaLibros.getLength(); i++) {
            Element libro = (Element) listaLibros.item(i);
            String id = libro.getAttribute("id");
            String titulo = libro.getElementsByTagName("titulo").item(0).getTextContent();
            String autor = libro.getElementsByTagName("autor").item(0).getTextContent();
            System.out.println("Libro " + id + ": " + titulo + " - " + autor);
        }
    }
}

En Java usamos DocumentBuilder para cargar el XML, obtenemos los nodos con getElementsByTagName y recorremos la lista para imprimir datos.

c) C# (.NET, System.Xml)

using System;
using System.Xml;

class Program {
    static void Main() {
        XmlDocument doc = new XmlDocument();
        doc.Load("biblioteca.xml");

        XmlNodeList libros = doc.GetElementsByTagName("libro");

        foreach (XmlNode libro in libros) {
            string id = libro.Attributes["id"].Value;
            string titulo = libro["titulo"].InnerText;
            string autor = libro["autor"].InnerText;
            Console.WriteLine($"Libro {id}: {titulo} - {autor}");
        }

        // Modificar valor
        libros[0]["titulo"].InnerText = "1984 (versión corregida)";
        doc.Save("biblioteca_modificada.xml");
    }
}

Muy similar a Python y Java, pero usando .NET con XmlDocument del espacio de nombres System.Xml.

5. Ventajas y desventajas del DOM

Ventajas

  • Fácil de usar para documentos pequeños y medianos.
  • Permite acceso total al árbol: lectura, escritura y modificación.
  • Se usa en muchos lenguajes y librerías.

Desventajas

  • Carga todo el documento en memoria, lo que no es eficiente para XML muy grandes.
  • Puede consumir muchos recursos en archivos de gran tamaño.

6. Ejemplo final: Modificar y guardar un XML con DOM

XML inicial (biblioteca.xml):

<biblioteca>
    <libro id="1">
        <titulo>1984</titulo>
        <autor>George Orwell</autor>
    </libro>
</biblioteca>

Código en Python (minidom):

from xml.dom import minidom

doc = minidom.parse("biblioteca.xml")

# Agregar un nuevo libro
nuevo_libro = doc.createElement("libro")
nuevo_libro.setAttribute("id", "2")

titulo = doc.createElement("titulo")
titulo.appendChild(doc.createTextNode("Don Quijote"))
nuevo_libro.appendChild(titulo)

autor = doc.createElement("autor")
autor.appendChild(doc.createTextNode("Miguel de Cervantes"))
nuevo_libro.appendChild(autor)

doc.documentElement.appendChild(nuevo_libro)

# Guardar el archivo modificado
with open("biblioteca_modificada.xml", "w", encoding="utf-8") as f:
    f.write(doc.toprettyxml())

Resultado (biblioteca_modificada.xml):

<biblioteca>
    <libro id="1">
        <titulo>1984</titulo>
        <autor>George Orwell</autor>
    </libro>
    <libro id="2">
        <titulo>Don Quijote</titulo>
        <autor>Miguel de Cervantes</autor>
    </libro>
</biblioteca>

7. Resumen didáctico

  • El DOM convierte el XML en un árbol en memoria.
  • Permite leer, modificar, agregar y eliminar elementos y atributos.
  • Se usa ampliamente en Python, Java, C#, JavaScript y otros lenguajes.
  • Ideal para documentos pequeños/medianos.