Trabajo con XML en Kotlin: bibliotecas, análisis y creación de documentos
XML (eXtensible Markup Language) sigue siendo un formato popular para almacenar y transmitir datos estructurados, especialmente en sistemas heredados, archivos de configuración y servicios web. Kotlin, al ser totalmente compatible con Java, proporciona acceso a todas las bibliotecas clásicas de Java para trabajar con XML, además de tener soluciones nativas. En este artículo, analizaremos los enfoques principales: análisis, creación y serialización de documentos XML en Kotlin.
1. Herramientas integradas de JDK: DOM, SAX, StAX
Gracias a la total interoperabilidad con Java, en Kotlin se pueden usar directamente las API estándar:
- DOM (Document Object Model) — carga todo el documento en memoria, útil para modificaciones.
- SAX (Simple API for XML) — analizador orientado a eventos, consumo mínimo de memoria.
- StAX (Streaming API for XML) — analizador de flujo con enfoque de cursor o eventos.
Ejemplo de análisis XML con DOM en Kotlin:
import javax.xml.parsers.DocumentBuilderFactoryimport org.w3c.dom.Element
fun parseXmlWithDom(xmlString: String) { val factory = DocumentBuilderFactory.newInstance() val builder = factory.newDocumentBuilder() val document = builder.parse(xmlString.byteInputStream()) val root = document.documentElement
val items = root.getElementsByTagName("item") for (i in 0 until items.length) { val item = items.item(i) as Element val name = item.getElementsByTagName("name").item(0).textContent val price = item.getElementsByTagName("price").item(0).textContent println("Item: $name, Price: $price") }}2. Biblioteca Simple XML (org.simpleframework.xml)
Simple XML es una biblioteca popular para la serialización/deserialización de objetos en XML. Utiliza anotaciones y no requiere archivos de configuración. Es ideal para API REST con respuestas XML.
Configuración (Gradle):
implementation("org.simpleframework:simple-xml:2.7.1")Ejemplo de modelo y deserialización:
import org.simpleframework.xml.*import org.simpleframework.xml.core.Persister
@Root(name = "catalog")data class Catalog( @field:ElementList(inline = true) var books: List<Book> = emptyList())
@Root(name = "book")data class Book( @field:Element(name = "title") var title: String = "", @field:Element(name = "author") var author: String = "", @field:Attribute(name = "id") var id: Int = 0)
fun deserializeXml(xml: String): Catalog { val serializer = Persister() return serializer.read(Catalog::class.java, xml)}3. kotlinx.serialization con formato XML
Para proyectos multiplataforma (KMP) es conveniente usar kotlinx.serialization con un formato XML personalizado. Existen adaptadores de terceros, como kotlinx-serialization-xml (de la comunidad).
Ejemplo con la biblioteca nl.adaptivity.xmlutil (compatible con JVM, JS, Native):
import nl.adaptivity.xmlutil.serialization.XMLimport kotlinx.serialization.*
@Serializabledata class Person( val name: String, @XmlSerialName("age") val years: Int)
fun main() { val xml = XML { indent = 4 xmlDeclMode = XmlDeclMode.Auto } val person = Person("Alice", 30) val result = xml.encodeToString(Person.serializer(), person) println(result) // <Person> // <name>Alice</name> // <age>30</age> // </Person>}4. XPath y XSLT en Kotlin
Para la selección de datos según criterios complejos, use XPath. En Kotlin, esto se hace a través de las clases estándar de Java javax.xml.xpath