在 Kotlin 中处理 XML:库概览与实践示例
XML(可扩展标记语言)仍然是存储和传输结构化数据的关键格式之一。在运行于 JVM 之上的 Kotlin 语言中,所有用于处理 XML 的 Java 库以及多个原生 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>" // 你的 XMLval 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 特点:
- 无需注解 — 开箱即用
- 支持集合、数组、嵌套对象
- 可以为类和字段配置别名
- 吃