العمل مع XML في Swift (iOS/macOS): من التحليل إلى الإنشاء
لا يزال XML (لغة الترميز القابلة للتوسيع) يُستخدم في الأنظمة القديمة وخدمات الويب (SOAP, RSS) وملفات التكوين. في Swift لنظامي iOS/macOS لا توجد مكتبة مدمجة مع سكر نحوي، ولكن يوجد XMLParser قوي (محلل SAX)، بالإضافة إلى مكتبة الطرف الثالث الشهيرة AEXML (نهج DOM). في هذه المقالة سنستعرض كلا النهجين.
1. XMLParser المدمج (نهج SAX)
XMLParser هو محلل موجه بالأحداث (SAX) من Foundation. لا يقوم بتحميل المستند بأكمله في الذاكرة، بل يستدعي طرق المفوض عند مواجهة العناصر. مثالي للملفات الكبيرة.
مثال: تحليل خلاصة RSS
import Foundation
class RSSParser: NSObject, XMLParserDelegate { private var currentElement = "" private var currentTitle = "" private var items: [String] = []
func parse(data: Data) -> [String] { let parser = XMLParser(data: data) parser.delegate = self parser.parse() return items }
// MARK: - XMLParserDelegate func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) { currentElement = elementName if elementName == "item" { currentTitle = "" } }
func parser(_ parser: XMLParser, foundCharacters string: String) { if currentElement == "title" { currentTitle += string } }
func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) { if elementName == "title" && !currentTitle.isEmpty { items.append(currentTitle.trimmingCharacters(in: .whitespacesAndNewlines)) } }}
// الاستخدامlet xmlString = """<rss> <channel> <item><title>Swift 6.0</title></item> <item><title>ميزات Xcode الجديدة</title></item> </channel></rss>"""if let data = xmlString.data(using: .utf8) { let parser = RSSParser() let titles = parser.parse(data: data) print(titles) // ["Swift 6.0", "ميزات Xcode الجديدة"]}هام: قد يتم استدعاء foundCharacters عدة مرات لعقدة نصية واحدة (خاصة مع السيريلية). قم دائمًا بتجميع السلسلة النصية بدلاً من تعيينها مباشرة.
2. AEXML — مكتبة DOM مريحة
AEXML هي مكتبة خفيفة للعمل مع XML بأسلوب DOM. تسمح بقراءة وإنشاء XML دون إدارة يدوية للأحداث. يتم تثبيتها عبر Swift Package Manager أو CocoaPods.
التثبيت عبر Swift Package Manager
أضفها في Package.swift أو عبر Xcode: File → Add Packages → أدخل الرابط: https://github.com/tadija/AEXML.git
مثال: قراءة XML
import AEXML
func parseWithAEXML(xmlString: String) -> [String: String]? { do { let xmlDoc = try AEXMLDocument(xml: xmlString) let root = xmlDoc.root
// الحصول على قيمة العنصر let name = root["user"]["name"].value ?? "" let age = root["user"]["age"].value ?? ""
// الوصول عبر السمة let id = root["user"].attributes["id"] ?? ""
return ["id": id, "name": name, "age": age] } catch { print("خطأ في التحليل: \\(error)") return nil }}
// مثال XMLlet xmlData = """<root> <user id="42"> <name>إيفان بيتروف</name> <age>30</age> </user></root>"""if let result = parseWithAEXML(xmlString: xmlData) { print(result) // ["id": "42", "name": "إيفان بيتروف", "age": "30"]}