Trabalho com XML em Java: DOM, SAX, StAX e JAXB
XML (eXtensible Markup Language) continua sendo um dos principais formatos para armazenamento e transmissão de dados estruturados. Em Java, existem várias formas de trabalhar com XML, cada uma adequada para diferentes tarefas: desde a leitura de pequenas configurações até o processamento de arquivos de gigabytes. Neste artigo, abordaremos quatro abordagens principais: DOM, SAX, StAX e JAXB.
1. DOM (Document Object Model) — carregamento completo na memória
O parser DOM carrega todo o documento XML na memória, criando uma estrutura em árvore. Isso é conveniente para navegação e modificação, mas ineficiente para arquivos grandes.
Exemplo de leitura de XML com 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("Livro: " + title + ", autor: " + author); } }}- Vantagens: acesso conveniente a qualquer nó, suporte a XPath, possibilidade de modificar o documento.
- Desvantagens: requer muita memória, lento para arquivos grandes.
- Quando usar: arquivos de configuração, documentos pequenos (até alguns MB).
2. SAX (Simple API for XML) — parser de fluxo orientado a eventos
SAX lê XML sequencialmente e gera eventos (início do elemento, texto, fim do elemento). Você processa apenas os eventos necessários — isso permite trabalhar com arquivos de qualquer tamanho.
Exemplo de processamento de XML com 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()); }}- Vantagens: consumo mínimo de memória, alta velocidade.
- Desvantagens: não é possível retornar ao elemento anterior, difícil modificar o documento.
- Quando usar: arquivos XML grandes (logs, dumps de BD, relatórios).
3. StAX (Streaming API for XML) — parser de fluxo com controle de cursor
StAX é uma alternativa mais moderna ao SAX. Você mesmo controla a leitura, movendo o cursor pelo fluxo XML. Dois modos estão disponíveis: Cursor API (iterador de eventos) e Event API (processamento de eventos).
Exemplo com Cursor API (XMLStreamReader):
import javax.xml.stream.*;
public class StaxExample { public static void main(String[] args) throws Exceptio Também na biblioteca
Geração de relatórios PDF em C++: biblioteca libharu e outras
Cache em C++: Redis, nível de dados e outras ferramentas
PDFKit para JavaScript (Node.js): guia completo com exemplos
Agendador de Tarefas PHP: tarefas semelhantes ao cron sem crond