العمل مع XML في Go (Golang): المكتبة القياسية encoding/xml

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

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

ابدأ الدورة

العمل مع XML في Go (Golang): دليل شامل لحزمة encoding/xml



في التطوير الحديث باستخدام Go (Golang)، تظهر مهمة معالجة بيانات XML بشكل متكرر — بدءًا من التكامل مع الأنظمة القديمة وصولاً إلى تبادل البيانات في خدمات SOAP. توفر المكتبة القياسية للغة Go حزمة قوية ومرنة encoding/xml، والتي تتيح تحليل وإنشاء وتحويل مستندات XML بكفاءة. في هذه المقالة، سنشرح بالتفصيل جميع الإمكانيات الرئيسية للعمل مع XML في Go.



الإمكانيات الأساسية لحزمة encoding/xml



تنفذ حزمة encoding/xml واجهة بسيطة لتسلسل (ترميز) هياكل Go إلى XML وإلغاء التسلسل (فك الترميز) من XML مرة أخرى إلى هياكل. وهي تدعم:



  • تحويل هياكل Go إلى مستندات XML والعكس
  • العمل مع السمات والعناصر المتداخلة ومساحات الأسماء
  • التحليل التدفقي لملفات XML الكبيرة عبر xml.Decoder
  • قواعد تسلسل قابلة للتخصيص باستخدام وسوم الهياكل


تثبيت واستيراد الحزمة



حزمة encoding/xml مضمنة في المكتبة القياسية لـ Go، لذلك لا يلزم تثبيت إضافي. للاستخدام، يكفي استيرادها:



import (    "encoding/xml"    "fmt"    "os")


الترميز: هيكل Go → XML



لتحويل هيكل Go إلى XML، تُستخدم الدالة xml.Marshal() أو xml.MarshalIndent() للإخراج المنسق. لنلقِ نظرة على مثال:



type Person struct {    XMLName   xml.Name `xml:"person"`    ID        int      `xml:"id,attr"`    FirstName string   `xml:"name>first"`    LastName  string   `xml:"name>last"`    Age       int      `xml:"age"`}

func main() { p := Person{ ID: 123, FirstName: "إيفان", LastName: "بيتروف", Age: 30, }

output, err := xml.MarshalIndent(p, "", " ") if err != nil { fmt.Printf("خطأ في الترميز: %v", err) return }

fmt.Println(string(output))}


نتيجة التنفيذ:



<person id="123">  <name>    <first>إيفان</first>    <last>بيتروف</last>  </name>  <age>30</age></person>


فك الترميز: XML → هيكل Go



العملية العكسية — تحويل بيانات XML إلى هيكل Go — تتم باستخدام xml.Unmarshal():



func unmarshalExample() {    xmlData := `<person id="456">  <name>    <first>ماريا</first>    <last>سيدوروفا</last>  </name>  <age>25</age></person>`

var p Person err := xml.Unmarshal([]byte(xmlData), &p) if err != nil { fmt.Printf("خطأ في فك الترميز: %v", err) return }

fmt.Printf("ID: %d, الاسم: %s %s, العمر: %d", p.ID, p.FirstName, p.LastName, p.Age) // الإخراج: ID: 456, الاسم: ماريا سيدوروفا, العمر: 25}


العمل مع السمات والعناصر المتداخلة



تستخدم حزمة encoding/xml وسوم الهياكل للتحكم في التعيين. التوجيهات الأساسية للوسوم:



  • xml:"name" — اسم العنصر
  • xml:"name,attr" — سمة العنصر
  • xml:"parent>child" — عنصر متداخل
  • xml:",chardata" — المحتوى النصي
  • xml:",innerxml" — XML خام داخل العنصر
  • xml:",comment" — تعليق XML
  • xml:"-" — تجاهل الحقل


التحليل التدفقي لملفات XML الكبيرة



لمعالجة مستندات XML الكبيرة (مثل الملفات بحجم غيغابايت)، يُستخدم المحلل التدفقي xml.Decoder. وهذا يسمح بعدم تحميل

توصيات