在 Kotlin 中处理 XML:用于解析和生成的库与工具

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

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

开始课程

在 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

推荐