在 Kotlin 中处理 XML:库概览与实践示例
尽管 JSON 和 YAML 被广泛采用,XML 在企业系统、配置文件、SOAP 协议和 Android 开发中仍然是不可或缺的格式。Kotlin 与 Java 兼容,因此可以访问所有成熟的 Java XML 库,同时也拥有自己的原生解决方案。在本文中,我们将探讨在 Kotlin 中处理 XML 的五种主要方法,包括文档的解析、生成和验证。
1. 内置工具:DOM、SAX、StAX
Kotlin 直接使用标准的 Java XML API。这是处理快速任务的最简单方法,但需要大量样板代码。
DOM(文档对象模型)
将整个 XML 加载到内存中,并允许对节点进行随机访问。适用于小型文档。
import javax.xml.parsers.DocumentBuilderFactoryimport org.w3c.dom.Element
fun parseWithDOM(xml: String) { val factory = DocumentBuilderFactory.newInstance() val builder = factory.newDocumentBuilder() val doc = builder.parse(xml.byteInputStream()) val books = doc.getElementsByTagName("book") for (i in 0 until books.length) { val book = books.item(i) as Element val title = book.getElementsByTagName("title").item(0).textContent println("书籍: $title") }}SAX(XML 简单 API)
流式解析器,不会将整个文档加载到内存中。对于大文件效率高,但实现起来较复杂。
import org.xml.sax.helpers.DefaultHandlerimport org.xml.sax.Attributesimport javax.xml.parsers.SAXParserFactory
class BookHandler : DefaultHandler() { override fun startElement(uri: String, localName: String, qName: String, attributes: Attributes) { if (qName == "book") { println("找到 id 为 ${attributes.getValue("id")} 的书籍") } }}
fun parseWithSAX(xml: String) { val factory = SAXParserFactory.newInstance() val parser = factory.newSAXParser() parser.parse(xml.byteInputStream(), BookHandler())}2. JDOM — 适合 Kotlin 的便捷 API
JDOM 是一个流行的 Java 库,由于支持集合和扩展函数,它与 Kotlin 完美集成。无需繁琐的工厂类即可读取、修改和生成 XML。
解析与导航
import org.jdom2.input.SAXBuilderimport org.jdom2.Element
fun parseWithJDOM(xml: String) { val builder = SAXBuilder() val doc = builder.build(xml.byteInputStream()) val root = doc.rootElement root.getChildren("book").forEach { book -> val title = book.getChildText("title") val author = book.getChildText("author") println("$title — $author") }}从零开始生成 XML
import org.jdom2.Documentimport org.jdom2.Elementimport org.jdom2.output.XMLOutputter
fun createXML(): String { val root = Element("library") val book = Element("book").apply { setAttribute("id", "1") addContent(Element("title").setText("Kotlin in Action")) addContent(Element("author").setText("Dmitry Jemerov")) } root.addContent(book) val doc = Document(root) val outputter = XMLOutputter().apply { format = org.jdom2.output.Format.getPrettyFormat() } return outputter.outputString(doc)}3. XOM — 简洁与严谨
XOM 遵循“默认不可变”原则——所有节点创建后无法修改,只能替换。这使得代码可预测且安全。该库会自动检查结构正确性。
import nu.xom.Builderimport nu.xom.Serializer
fun parseWithXOM(xml: String) { val builder = Builder() val doc = builder.build(xml, null) val root = doc.rootElement