العمل مع XML في Kotlin: نظرة عامة على المكتبات وأمثلة عملية
XML (لغة الترميز القابلة للتوسع) لا يزال أحد التنسيقات الرئيسية لتخزين ونقل البيانات المنظمة. في لغة Kotlin، التي تعمل فوق JVM، تتوفر جميع مكتبات Java للعمل مع XML، بالإضافة إلى عدة حلول أصلية لـ 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>" // XML الخاص بكval rss = parseRss(xml)rss?.channel?.items?.forEach { item -> println("${item.title}: ${item.link}")}مزايا SimpleXML: البساطة، دعم الوراثة، محولات مدمجة للتواريخ والأرقام.
2. XStream — تسلسل سريع للكائنات
XStream هي مكتبة قوية أخرى يمكنها تسلسل الكائنات إلى XML بدون تعليقات توضيحية. تستخدم الانعكاس (reflection) وهي مناسبة تمامًا للنماذج الأولية.
الإضافة:
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:
- لا يتطلب تعليقات توضيحية — يعمل "مباشرة من الصندوق"
- يدعم المجموعات، المصفوفات، الكائنات المتداخلة
- يمكن تخصيص الأسماء المستعارة للفئات والحقول
- يأكل