JSON إلى XML
تحويل JSON إلى صيغة XML
إدخال JSON
إخراج XML
ما هو تحويل JSON إلى XML؟
يُعدّ JSON (تدوين كائنات JavaScript) وXML (لغة الترميز الموسّعة) التنسيقَين السائدَين لتبادل البيانات في تطوير البرمجيات. يعتمد JSON على أزواج مفتاح-قيمة ومصفوفات بصيغة مدمجة، بينما يُغلّف XML البيانات بوسوم افتتاحية وختامية مع خصائص اختيارية. يعني تحويل JSON إلى XML ترجمةَ مكوّناته البنيوية الأساسية — الكائنات والمصفوفات والسلاسل النصية والأرقام والقيم المنطقية وقيمة null — إلى مستند XML صحيح البنية يعكس تداخل العناصر الأصلي.
لا يزال XML التنسيقَ المطلوب في كثير من الأنظمة المؤسسية وواجهات برمجة التطبيقات الحكومية وخدمات SOAP الإلكترونية والمعايير الصناعية كـHL7 (الرعاية الصحية) وFpML (التمويل) وXBRL (التقارير المالية). حين يُنتج تطبيقك JSON بينما يتوقع الطرف المستقبل XML، يتولى المحوّل عملية الترجمة دون الحاجة إلى إعادة الهيكلة يدويًا. يتبع التحويل قواعد ربط واضحة: تصبح كائنات JSON عناصر XML، وتصبح عناصر المصفوفة عناصر شقيقة متكررة، وتصبح القيم الأولية عُقَدًا نصية.
لا يوجد معيار RFC أو W3C موحّد يحدد كيفية ربط JSON بـXML. تنتج المكتبات المختلفة مخرجات متباينة للمدخلات نفسها. تتمثل الاتفاقية الأكثر شيوعًا (المعتمدة في هذه الأداة) في تغليف المستند بأكمله ضمن عنصر جذري قابل للتهيئة، وتحويل كل مفتاح JSON إلى عنصر XML فرعي، وتمثيل عناصر المصفوفة كعناصر متكررة بنفس اسم الوسم. يكتسب فهم قواعد الربط هذه أهمية بالغة حين يفرض النظام المستقبِل مخططًا XML محددًا (XSD).
لماذا تستخدم محوّل JSON إلى XML الإلكتروني؟
كتابة XML يدويًا من مصدر JSON أمرٌ شاق ومعرّض للأخطاء. فالوسوم غير المتطابقة والعناصر الختامية المنسية والتداخل الخاطئ تُنتج مستندات لا تجتاز التحقق من المخطط. يتولى المحوّل عملية الترجمة البنيوية تلقائيًا.
حالات استخدام تحويل JSON إلى XML
قواعد ربط JSON بـXML
نظرًا لغياب معيار موحّد يحكم تحويل JSON إلى XML، تنتج الأدوات المختلفة مخرجات متباينة. يوضح الجدول أدناه اتفاقيات الربط المعتمدة في هذه الأداة وفي معظم المكتبات الشائعة (js2xmlparser وxmlbuilder وfast-xml-parser). سادت اتفاقية العناصر الشقيقة المتكررة للمصفوفات لأنها تعكس الطريقة التي تُمثِّل بها مخططات XML المجموعات بشكل طبيعي — إذ يُعدّ كل عنصر كيانًا مستقلًا لا ابنًا مُغلَّفًا — وتتكامل بسلاسة مع استعلامات XPath وتحويلات XSLT.
| JSON Type | JSON Example | XML Output |
|---|---|---|
| Object | {"name": "Alice"} | <name>Alice</name> |
| Nested object | {"user": {"age": 30}} | <user><age>30</age></user> |
| Array | {"colors": ["red", "blue"]} | <colors>red</colors><colors>blue</colors> |
| String | "hello" | <root>hello</root> |
| Number | 42 | <root>42</root> |
| Boolean | true | <root>true</root> |
| Null | null | <root/> |
| Empty object | {} | <root/> |
| Empty array | [] | (no child elements) |
أمثلة برمجية
فيما يلي مقاطع قابلة للتشغيل لتحويل JSON إلى XML في ثلاثة بيئات مختلفة. يُنتج كل مثال XML صحيح البنية من كائن JSON نموذجي.
import { create } from 'xmlbuilder2';
const json = {
order: {
id: 1024,
items: [
{ sku: "A1", qty: 2 },
{ sku: "B3", qty: 1 }
],
shipped: false
}
};
const xml = create({ version: '1.0' })
.ele(json)
.end({ prettyPrint: true });
console.log(xml);
// → <?xml version="1.0"?>
// → <order>
// → <id>1024</id>
// → <items>
// → <sku>A1</sku>
// → <qty>2</qty>
// → </items>
// → <items>
// → <sku>B3</sku>
// → <qty>1</qty>
// → </items>
// → <shipped>false</shipped>
// → </order>import json
import xmltodict
data = {
"order": {
"id": 1024,
"items": [
{"sku": "A1", "qty": 2},
{"sku": "B3", "qty": 1}
],
"shipped": False
}
}
# xmltodict.unparse expects a single root key
xml = xmltodict.unparse(data, pretty=True)
print(xml)
# → <?xml version="1.0" encoding="utf-8"?>
# → <order>
# → <id>1024</id>
# → <items>
# → <sku>A1</sku>
# → <qty>2</qty>
# → </items>
# → <items>
# → <sku>B3</sku>
# → <qty>1</qty>
# → </items>
# → <shipped>false</shipped>
# → </order>package main
import (
"encoding/json"
"encoding/xml"
"fmt"
)
type Item struct {
SKU string `json:"sku" xml:"sku"`
Qty int `json:"qty" xml:"qty"`
}
type Order struct {
XMLName xml.Name `xml:"order"`
ID int `json:"id" xml:"id"`
Items []Item `json:"items" xml:"items"`
Shipped bool `json:"shipped" xml:"shipped"`
}
func main() {
raw := `{"id":1024,"items":[{"sku":"A1","qty":2},{"sku":"B3","qty":1}],"shipped":false}`
var order Order
json.Unmarshal([]byte(raw), &order)
out, _ := xml.MarshalIndent(order, "", " ")
fmt.Println(xml.Header + string(out))
// → <?xml version="1.0" encoding="UTF-8"?>
// → <order>
// → <id>1024</id>
// → <items>
// → <sku>A1</sku>
// → <qty>2</qty>
// → </items>
// → ...
}