在 Kotlin 中处理 XML:库与代码示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在 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 特点:

  • 无需注解 — 开箱即用
  • 支持集合、数组、嵌套对象
  • 可以为类和字段配置别名
  • 吃

推荐