العمل مع 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"— تعليق XMLxml:"-"— تجاهل الحقل
التحليل التدفقي لملفات XML الكبيرة
لمعالجة مستندات XML الكبيرة (مثل الملفات بحجم غيغابايت)، يُستخدم المحلل التدفقي xml.Decoder. وهذا يسمح بعدم تحميل