Работа с XML в Kotlin: обзор библиотек и практические примеры
XML (eXtensible Markup Language) остаётся одним из ключевых форматов для хранения и передачи структурированных данных. В языке Kotlin, который работает поверх JVM, доступны все Java-библиотеки для работы с XML, а также несколько нативных Kotlin-решений. В этой статье рассмотрим три основных подхода к работе с XML: SimpleXML (аннотационный парсинг), XStream (быстрая сериализация) и kotlinx.serialization (нативная Kotlin-библиотека).
1. SimpleXML — аннотационный парсинг XML
SimpleXML — популярная библиотека для Java/Kotlin, которая позволяет преобразовывать XML в объекты и обратно с помощью аннотаций. Она идеально подходит, когда структура XML известна заранее.
Подключение (Gradle):
dependencies {
implementation("org.simpleframework:simple-xml:2.7.1")
}
Пример: парсинг RSS-ленты
Допустим, у нас есть XML с новостями:
<rss version="2.0">
<channel>
<item>
<title>Новость 1</title>
<link>https://example.com/1</link>
</item>
<item>
<title>Новость 2</title>
<link>https://example.com/2</link>
</item>
</channel>
</rss>
Создадим модели данных с аннотациями:
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 = ""
)
Парсинг 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("Ошибка парсинга: ${e.message}")
null
}
}
// Использование:
val xml = "<rss version=\"2.0\">...</rss>" // ваш XML
val rss = parseRss(xml)
rss?.channel?.items?.forEach { item ->
println("${item.title}: ${item.link}")
}
Плюсы SimpleXML: простота, поддержка наследования, встроенные конвертеры для дат и чисел.
2. XStream — быстрая сериализация объектов
XStream — ещё одна мощная библиотека, которая умеет сериализовать объекты в XML без аннотаций. Она использует рефлексию и хорошо подходит для прототипирования.
Подключение:
dependencies {
implementation("com.thoughtworks.xstream:xstream:1.4.20")
}
Пример: сериализация и десериализация
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)
// Сериализация
val person = Person("Иван", 30)
val xml = xstream.toXML(person)
println(xml)
// Вывод: <person><name>Иван</name><age>30</age></person>
// Десериализация
val restored = xstream.fromXML(xml) as Person
println("Имя: ${restored.name}, Возраст: ${restored.age}")
}
Особенности XStream:
- Не требует аннотаций — работает "из коробки"
- Поддерживает коллекции, массивы, вложенные объекты
- Можно настраивать псевдонимы для классов и полей
- Есть встроенная поддержка JSON (через Jettison)
3. kotlinx.serialization — нативный подход Kotlin
kotlinx.serialization — официальная библиотека Kotlin для сериализации. Изначально создавалась для JSON, но имеет модуль для XML (экспериментальный).
Подключение:
Также в библиотеке
Рекомендаций