Arbeiten mit XML in Kotlin: Überblick über Bibliotheken und praktische Beispiele
XML (eXtensible Markup Language) bleibt eines der wichtigsten Formate zum Speichern und Übertragen strukturierter Daten. In der Sprache Kotlin, die auf der JVM läuft, sind alle Java-Bibliotheken für die Arbeit mit XML verfügbar, sowie einige native Kotlin-Lösungen. In diesem Artikel betrachten wir drei Hauptansätze für die Arbeit mit XML: SimpleXML (annotationsbasiertes Parsen), XStream (schnelle Serialisierung) und kotlinx.serialization (native Kotlin-Bibliothek).
1. SimpleXML — annotationsbasiertes XML-Parsing
SimpleXML ist eine beliebte Bibliothek für Java/Kotlin, die es ermöglicht, XML mit Hilfe von Annotationen in Objekte und zurück zu konvertieren. Sie ist ideal geeignet, wenn die XML-Struktur im Voraus bekannt ist.
Einbindung (Gradle):
dependencies { implementation("org.simpleframework:simple-xml:2.7.1")}Beispiel: Parsen eines RSS-Feeds
Angenommen, wir haben ein XML mit Nachrichten:
<rss version="2.0"> <channel> <item> <title>Nachricht 1</title> <link>https://example.com/1</link> </item> <item> <title>Nachricht 2</title> <link>https://example.com/2</link> </item> </channel></rss>Erstellen wir Datenmodelle mit Annotationen:
import org.simpleframework.xml.*
@Root(name = "rss", strict = false)data class Rss( @field:Element(name = "channel") var channel: Channel? = null)
@Root(name = "channel", strict = false)data class Channel( @field:ElementList(inline = true, entry = "item") var items: List<Item> = emptyList())
@Root(name = "item", strict = false)data class Item( @field:Element(name = "title") var title: String = "",
@field:Element(name = "link") var link: String = "")Parsen des XML:
import org.simpleframework.xml.core.Persister
fun parseRss(xmlString: String): Rss? { return try { val serializer = Persister() serializer.read(Rss::class.java, xmlString) } catch (e: Exception) { println("Parsing-Fehler: ${e.message}") null }}
// Verwendung:val xml = "<rss version=\\"2.0\\">...</rss>" // Ihr XMLval rss = parseRss(xml)rss?.channel?.items?.forEach { item -> println("${item.title}: ${item.link}")}Vorteile von SimpleXML: Einfachheit, Unterstützung von Vererbung, integrierte Konverter für Daten und Zahlen.
2. XStream — schnelle Objektserialisierung
XStream ist eine weitere leistungsstarke Bibliothek, die Objekte ohne Annotationen in XML serialisieren kann. Sie verwendet Reflektion und eignet sich gut für das Prototyping.
Einbindung:
dependencies { implementation("com.thoughtworks.xstream:xstream:1.4.20")}Beispiel: Serialisierung und Deserialisierung
import com.thoughtworks.xstream.XStream
data class Person(val name: String, val age: Int)
fun main() { val xstream = XStream() xstream.alias("person", Person::class.java)
// Serialisierung val person = Person("Ivan", 30) val xml = xstream.toXML(person) println(xml) // Ausgabe: <person><name>Ivan</name><age>30</age></person>
// Deserialisierung val restored = xstream.fromXML(xml) as Person println("Name: ${restored.name}, Alter: ${restored.age}")}Besonderheiten von XStream:
- Benötigt keine Annotationen — funktioniert "out of the box"
- Unterstützt Sammlungen, Arrays, verschachtelte Objekte
- Aliase für Klassen und Felder können konfiguriert werden
- Isst