Arbeiten mit XML in Kotlin: Bibliotheken, Parsing und Dokumenterstellung
XML (eXtensible Markup Language) bleibt ein gefragtes Format für die Speicherung und Übertragung strukturierter Daten, insbesondere in Legacy-Systemen, Konfigurationsdateien und Webdiensten. Kotlin, das vollständig mit Java kompatibel ist, bietet Zugriff auf alle klassischen Java-Bibliotheken für die Arbeit mit XML sowie native Lösungen. In diesem Artikel behandeln wir die grundlegenden Ansätze: Parsing, Erstellung und Serialisierung von XML-Dokumenten in Kotlin.
1. Integrierte JDK-Mittel: DOM, SAX, StAX
Dank der vollständigen Interoperabilität mit Java können in Kotlin die Standard-APIs direkt verwendet werden:
- DOM (Document Object Model) — lädt das gesamte Dokument in den Speicher, geeignet für Änderungen.
- SAX (Simple API for XML) — ereignisgesteuerter Parser, minimaler Speicherverbrauch.
- StAX (Streaming API for XML) — Streaming-Parser mit cursor- oder ereignisbasiertem Ansatz.
Beispiel für XML-Parsing mit DOM in 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. Bibliothek Simple XML (org.simpleframework.xml)
Simple XML ist eine beliebte Bibliothek zur Serialisierung/Deserialisierung von Objekten in XML. Sie verwendet Annotationen und benötigt keine Konfigurationsdateien. Ideal für REST-APIs mit XML-Antworten.
Einbindung (Gradle):
implementation("org.simpleframework:simple-xml:2.7.1")Beispiel für ein Modell und Deserialisierung:
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 mit XML-Format
Für plattformübergreifende Projekte (KMP) ist die Verwendung von kotlinx.serialization mit einem benutzerdefinierten XML-Format praktisch. Es gibt Drittanbieter-Adapter, z. B. kotlinx-serialization-xml (aus der Community).
Beispiel mit der Bibliothek nl.adaptivity.xmlutil (unterstützt 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 und XSLT in Kotlin
Für die Datenselektion nach komplexen Kriterien verwenden Sie XPath. In Kotlin erfolgt dies über die Standard-Java-Klassen javax.xml.xpath
Auch in der Bibliothek
Empfehlungen