DOM (Document Object Model) es una representación en memoria de un documento XML como un árbol de nodos.
DOM carga todo el archivo XML completo en memoria, lo que lo hace muy práctico para manipular documentos pequeños o medianos.
<?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"
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.
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.
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
.
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>