العمل مع XML في Go (Golang): دليل شامل مع أمثلة
يوفر Go (Golang) دعمًا مدمجًا للعمل مع XML من خلال حزمة encoding/xml. توفر هذه الحزمة أدوات قوية لتحليل (قراءة) وتوليد (كتابة) وتسلسل البيانات بتنسيق XML. على عكس JSON، يتطلب XML بنية أكثر صرامة ودعمًا لمساحات الأسماء (namespaces)، مما يجعل encoding/xml مرنًا بشكل خاص.
في هذه المقالة، سنشرح بالتفصيل كيفية العمل مع XML في Go: من unmarshalling الأساسي (تحويل XML إلى هياكل Go) إلى إنشاء مستندات XML معقدة مع السمات ومساحات الأسماء.
الأساسيات: الهياكل ووسوم XML
لمطابقة عناصر XML مع حقول الهياكل في Go، تُستخدم وسوم خاصة xml. وهي تحدد اسم العنصر والسمات والسلوك أثناء التسلسل.
type Person struct { XMLName xml.Name `xml:"person"` ID int `xml:"id,attr"` Name string `xml:"name"` Age int `xml:"age"` Email string `xml:"email,omitempty"` Addresses []Address `xml:"address"`}
type Address struct { City string `xml:"city"` Street string `xml:"street"` ZipCode string `xml:"zip"`}xml:"person"— اسم العنصر الجذر.xml:"id,attr"— يصبح الحقل سمة للعنصر.xml:"email,omitempty"— يتم تخطي الحقل إذا كان فارغًا.xml:"address"— سيتم تسلسل المصفوفة كعدة عناصر متداخلة.
تحليل XML: Unmarshalling
تقوم الدالة xml.Unmarshal بتحويل بايتات XML إلى هيكل Go. لنلق نظرة على مثال مع النوع Person الخاص بنا:
package main
import ( "encoding/xml" "fmt")
func main() { xmlData := `<person id="123"> <name>إيفان بيتروف</name> <age>30</age> <email>ivan@example.com</email> <address> <city>موسكو</city> <street>تفرسكايا، 1</street> <zip>101000</zip> </address></person>`
var p Person err := xml.Unmarshal([]byte(xmlData), &p) if err != nil { fmt.Printf("خطأ في التحليل: %v", err) return }
fmt.Printf("المعرف: %d", p.ID) fmt.Printf("الاسم: %s", p.Name) fmt.Printf("العمر: %d", p.Age) fmt.Printf("المدينة: %s", p.Addresses[0].City)}مخرجات البرنامج:
المعرف: 123الاسم: إيفان بيتروفالعمر: 30المدينة: موسكوتوليد XML: Marshalling
لإنشاء XML من هيكل، يُستخدم xml.Marshal أو xml.MarshalIndent (مع مسافات بادئة).
func main() { p := Person{ ID: 456, Name: "آنا سميرنوفا", Age: 25, Email: "anna@example.com", Addresses: []Address{ {City: "سانت بطرسبرغ", Street: "نيفسكي، 10", ZipCode: "191186"}, }, }
output, err := xml.MarshalIndent(p, "", " ") if err != nil { fmt.Printf("خطأ في التسلسل: %v", err) return }
fmt.Println(string(output))}النتيجة:
<person id="456"> <name>آنا سميرنوفا</name> <age>25</age> <email>anna@example.com</email> <address> <city>سانت بطرسبرغ</city> <street>نيفسكي، 10</street> <zip>191186</zip> </address></person>العمل مع مساحات الأسماء (Namespaces)
تتم معالجة مساحات أسماء XML من خلال الحقل XMLName مع السمة xmlns.
type Document struct { XMLName xml.Name `xml