Trabalho com XML em Kotlin: visão geral das bibliotecas e exemplos práticos
Apesar da adoção ativa de JSON e YAML, o XML continua sendo um formato relevante em sistemas corporativos, arquivos de configuração, protocolos SOAP e desenvolvimento Android. Kotlin, sendo compatível com Java, fornece acesso a todas as bibliotecas Java maduras para trabalhar com XML, além de ter suas próprias soluções nativas. Neste artigo, abordaremos cinco abordagens principais para processamento de XML em Kotlin, incluindo parsing, criação e validação de documentos.
1. Ferramentas integradas: DOM, SAX, StAX
Kotlin usa diretamente a API Java padrão para XML. Esta é a maneira mais simples para tarefas rápidas, mas requer muito código boilerplate.
DOM (Document Object Model)
Carrega todo o XML na memória e permite acesso aleatório aos nós. Adequado para documentos pequenos.
import javax.xml.parsers.DocumentBuilderFactoryimport org.w3c.dom.Element
fun parseWithDOM(xml: String) { val factory = DocumentBuilderFactory.newInstance() val builder = factory.newDocumentBuilder() val doc = builder.parse(xml.byteInputStream()) val books = doc.getElementsByTagName("book") for (i in 0 until books.length) { val book = books.item(i) as Element val title = book.getElementsByTagName("title").item(0).textContent println("Livro: $title") }}SAX (Simple API for XML)
Parser de fluxo, não carrega todo o documento na memória. Eficiente para arquivos grandes, mas complexo de implementar.
import org.xml.sax.helpers.DefaultHandlerimport org.xml.sax.Attributesimport javax.xml.parsers.SAXParserFactory
class BookHandler : DefaultHandler() { override fun startElement(uri: String, localName: String, qName: String, attributes: Attributes) { if (qName == "book") { println("Livro encontrado com id: ${attributes.getValue("id")}") } }}
fun parseWithSAX(xml: String) { val factory = SAXParserFactory.newInstance() val parser = factory.newSAXParser() parser.parse(xml.byteInputStream(), BookHandler())}2. JDOM — API conveniente para Kotlin
JDOM é uma biblioteca Java popular que se integra perfeitamente com Kotlin graças ao suporte a coleções e funções de extensão. Permite ler, modificar e criar XML sem fábricas complexas.
Parsing e navegação
import org.jdom2.input.SAXBuilderimport org.jdom2.Element
fun parseWithJDOM(xml: String) { val builder = SAXBuilder() val doc = builder.build(xml.byteInputStream()) val root = doc.rootElement root.getChildren("book").forEach { book -> val title = book.getChildText("title") val author = book.getChildText("author") println("$title — $author") }}Criação de XML do zero
import org.jdom2.Documentimport org.jdom2.Elementimport org.jdom2.output.XMLOutputter
fun createXML(): String { val root = Element("library") val book = Element("book").apply { setAttribute("id", "1") addContent(Element("title").setText("Kotlin in Action")) addContent(Element("author").setText("Dmitry Jemerov")) } root.addContent(book) val doc = Document(root) val outputter = XMLOutputter().apply { format = org.jdom2.output.Format.getPrettyFormat() } return outputter.outputString(doc)}3. XOM — simplicidade e rigor
XOM segue o princípio "imutável por padrão" — todos os nós, após criados, não podem ser alterados, apenas substituídos. Isso torna o código previsível e seguro. A biblioteca verifica automaticamente a correção da estrutura.
import nu.xom.Builderimport nu.xom.Serializer
fun parseWithXOM(xml: String) { val builder = Builder() val doc = builder.build(xml, null) val root = doc.rootElement Também na biblioteca
Autorização e Autenticação em Rust: Bibliotecas e Ferramentas
Biblioteca Padrão C++: visão geral completa dos recursos
Trabalho com Markdown em C++: bibliotecas, parsers e ferramentas