العمل مع XML في Kotlin: المكتبات، التحليل وإنشاء المستندات
لا يزال XML (لغة الترميز الموسعة) تنسيقًا مطلوبًا لتخزين ونقل البيانات المنظمة، خاصة في الأنظمة القديمة وملفات التكوين وخدمات الويب. Kotlin، كونه متوافقًا تمامًا مع Java، يوفر الوصول إلى جميع مكتبات Java الكلاسيكية للعمل مع XML، بالإضافة إلى وجود حلول أصلية. في هذه المقالة، سنستعرض الأساليب الرئيسية: تحليل وإنشاء وتسلسل مستندات XML في Kotlin.
1. أدوات JDK المضمنة: DOM, SAX, StAX
بفضل قابلية التشغيل البيني الكاملة مع Java، يمكن استخدام واجهات برمجة التطبيقات القياسية مباشرة في Kotlin:
- DOM (نموذج كائن المستند) — يقوم بتحميل المستند بأكمله في الذاكرة، وهو مناسب للتعديلات.
- SAX (واجهة برمجة تطبيقات بسيطة لـ XML) — محلل يعتمد على الأحداث، استهلاك ضئيل للذاكرة.
- StAX (واجهة برمجة تطبيقات التدفق لـ XML) — محلل تدفق مع نهج المؤشر أو الأحداث.
مثال على تحليل XML باستخدام DOM في Kotlin:
import javax.xml.parsers.DocumentBuilderFactoryimport org.w3c.dom.Element
fun parseXmlWithDom(xmlString: String) { val factory = DocumentBuilderFactory.newInstance() val builder = factory.newDocumentBuilder() val document = builder.parse(xmlString.byteInputStream()) val root = document.documentElement
val items = root.getElementsByTagName("item") for (i in 0 until items.length) { val item = items.item(i) as Element val name = item.getElementsByTagName("name").item(0).textContent val price = item.getElementsByTagName("price").item(0).textContent println("Item: $name, Price: $price") }}2. مكتبة Simple XML (org.simpleframework.xml)
Simple XML — مكتبة شائعة لتسلسل/إلغاء تسلسل الكائنات إلى XML. تستخدم التعليقات التوضيحية ولا تتطلب ملفات تكوين. مناسبة تمامًا لواجهات برمجة تطبيقات REST مع استجابات XML.
الإضافة (Gradle):
implementation("org.simpleframework:simple-xml:2.7.1")مثال على النموذج وإلغاء التسلسل:
import org.simpleframework.xml.*import org.simpleframework.xml.core.Persister
@Root(name = "catalog")data class Catalog( @field:ElementList(inline = true) var books: List<Book> = emptyList())
@Root(name = "book")data class Book( @field:Element(name = "title") var title: String = "", @field:Element(name = "author") var author: String = "", @field:Attribute(name = "id") var id: Int = 0)
fun deserializeXml(xml: String): Catalog { val serializer = Persister() return serializer.read(Catalog::class.java, xml)}3. kotlinx.serialization مع تنسيق XML
للمشاريع متعددة المنصات (KMP)، من المناسب استخدام kotlinx.serialization مع تنسيق XML مخصص. توجد محولات طرف ثالث، مثل kotlinx-serialization-xml (من المجتمع).
مثال مع مكتبة nl.adaptivity.xmlutil (تدعم JVM, JS, Native):
import nl.adaptivity.xmlutil.serialization.XMLimport kotlinx.serialization.*
@Serializabledata class Person( val name: String, @XmlSerialName("age") val years: Int)
fun main() { val xml = XML { indent = 4 xmlDeclMode = XmlDeclMode.Auto } val person = Person("Alice", 30) val result = xml.encodeToString(Person.serializer(), person) println(result) // <Person> // <name>Alice</name> // <age>30</age> // </Person>}4. XPath و XSLT في Kotlin
لاستخراج البيانات بناءً على معايير معقدة، استخدم XPath. في Kotlin، يتم ذلك من خلال فئات Java القياسية javax.xml.xpath
أيضاً في المكتبة
توصيات