Trabajo con XML en Java: DOM, SAX, StAX y JAXB
XML (eXtensible Markup Language) sigue siendo uno de los formatos clave para almacenar y transmitir datos estructurados. En Java existen varias formas de trabajar con XML, cada una adecuada para diferentes tareas: desde la lectura de pequeñas configuraciones hasta el procesamiento de archivos de gigabytes. En este artículo, analizaremos cuatro enfoques principales: DOM, SAX, StAX y JAXB.
1. DOM (Document Object Model) — carga completa en memoria
El analizador DOM carga todo el documento XML en la memoria, creando una estructura de árbol. Esto es conveniente para la navegación y modificación, pero ineficiente para archivos grandes.
Ejemplo de lectura de XML con DOM:
import javax.xml.parsers.*;import org.w3c.dom.*;
public class DomExample { public static void main(String[] args) throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse("books.xml");
NodeList bookList = doc.getElementsByTagName("book"); for (int i = 0; i < bookList.getLength(); i++) { Element book = (Element) bookList.item(i); String title = book.getElementsByTagName("title").item(0).getTextContent(); String author = book.getElementsByTagName("author").item(0).getTextContent(); System.out.println("Libro: " + title + ", autor: " + author); } }}- Ventajas: acceso conveniente a cualquier nodo, soporte para XPath, posibilidad de modificar el documento.
- Desventajas: requiere mucha memoria, lento para archivos grandes.
- Cuándo usarlo: archivos de configuración, documentos pequeños (hasta unos pocos MB).
2. SAX (Simple API for XML) — analizador de flujo basado en eventos
SAX lee XML secuencialmente y genera eventos (inicio de elemento, texto, fin de elemento). Usted procesa solo los eventos necesarios, lo que permite trabajar con archivos de cualquier tamaño.
Ejemplo de procesamiento de XML con SAX:
import org.xml.sax.*;import org.xml.sax.helpers.*;import javax.xml.parsers.*;
public class SaxExample extends DefaultHandler { private boolean inTitle = false;
public void startElement(String uri, String localName, String qName, Attributes attrs) { if (qName.equals("title")) inTitle = true; }
public void characters(char[] ch, int start, int length) { if (inTitle) System.out.println("Título: " + new String(ch, start, length)); }
public void endElement(String uri, String localName, String qName) { if (qName.equals("title")) inTitle = false; }
public static void main(String[] args) throws Exception { SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); parser.parse("books.xml", new SaxExample()); }}- Ventajas: consumo mínimo de memoria, alta velocidad.
- Desventajas: no se puede volver al elemento anterior, difícil modificar el documento.
- Cuándo usarlo: archivos XML grandes (registros, volcados de BD, informes).
3. StAX (Streaming API for XML) — analizador de flujo con control de cursor
StAX es una alternativa más moderna a SAX. Usted mismo controla la lectura, moviendo el cursor a través del flujo XML. Hay dos modos disponibles: Cursor API (iterador de eventos) y Event API (procesamiento de eventos).
Ejemplo con Cursor API (XMLStreamReader):
import javax.xml.stream.*;
public class StaxExample { public static void main(String[] args) throws Exceptio