العمل مع XML في Go: encoding/xml، المكتبات والأمثلة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

العمل مع 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                    

توصيات