YAML إلى XML
تحويل YAML إلى XML
إدخال YAML
إخراج XML
ما هو تحويل YAML إلى XML؟
تحويل YAML إلى XML هو عملية تحويل البيانات المكتوبة بلغة YAML (اختصار لـ YAML Ain't Markup Language) إلى لغة XML (لغة الترميز الموسّعة). يعتمد YAML على المسافات البادئة والترميز المحدود لتمثيل البيانات الهيكلية، بينما يستخدم XML وسوم الفتح والإغلاق مع تسلسل هرمي صريح. يُعدّ التحويل بين التنسيقين مهمة شائعة عندما تحتاج الأنظمة التي تستهلك XML إلى استقبال بيانات أُعدّت أصلًا بصيغة YAML.
صُمِّم YAML للقراءة البشرية. ملفات إعداد أدوات مثل Kubernetes وAnsible وDocker Compose وGitHub Actions تُكتب بـYAML لأنه مضغوط وسهل التحرير يدويًا. أما XML، المُحدَّد بمواصفة W3C XML 1.0، فقد ظلّ تنسيق تبادل البيانات الافتراضي في الأنظمة المؤسسية وخدمات SOAP الويب وسير العمل الموثّقة لعقود. وعندما يجب أن تُغذّي إعدادات YAML خطوطَ أنابيب تعتمد على XML، يصبح التحويل ضروريًا.
لا يوجد تطابق واحد لواحد بين YAML وXML. يدعم YAML أنواع بيانات أصلية كالقيم المنطقية والأعداد الصحيحة والعشرية والقيم الفارغة، بينما يعامل XML كل المحتوى كنص ما لم يُحدِّد مخطط (XSD أو DTD) الأنواع خارجيًا. كذلك لا يوجد في XML ما يقابل متتاليات YAML (القوائم) مباشرةً، وتُمثَّل كعناصر مكررة. فهم هذه الفوارق يساعدك على توقّع المخرجات وتجنّب المفاجآت.
لماذا تستخدم محوّل YAML إلى XML هذا؟
إعادة كتابة YAML بصيغة XML يدويًا عملية مرهقة وعرضة للأخطاء، خاصةً في البنى المتداخلة بعمق. يعالج هذا المحوّل الترجمة الهيكلية فوريًا.
حالات استخدام تحويل YAML إلى XML
مرجع ربط أنواع YAML بـXML
أنواع بيانات YAML لا تتماثل مع XML مباشرةً. يوضح هذا الجدول كيف تُترجَم كل بنية YAML إلى ما يقابلها في XML. فهم هذه القواعد يساعدك على توقّع المخرجات واستكشاف النتائج غير المتوقعة.
| نوع YAML | مثال YAML | مخرجات XML |
|---|---|---|
| Mapping (key: value) | { name: Alice } | <name>Alice</name> |
| Sequence (- item) | - apple\n- banana | <item>apple</item><item>banana</item> |
| Nested mapping | user:\n name: Alice | <user><name>Alice</name></user> |
| Scalar (string) | greeting: hello world | <greeting>hello world</greeting> |
| Scalar (number) | count: 42 | <count>42</count> |
| Scalar (boolean) | active: true | <active>true</active> |
| Null | value: null | <value/> |
| Multiline string | bio: |\n Line one\n Line two | <bio>Line one\nLine two</bio> |
YAML مقابل XML: الفوارق بين التنسيقين
يحلّ YAML وXML المشكلة ذاتها — تمثيل البيانات الهيكلية — مع مقايضات مختلفة. لا يتفوق أيٌّ منهما على الآخر بشكل مطلق؛ الاختيار الصحيح يعتمد على من يستهلك البيانات أو ما يستهلكها.
| الميزة | YAML | XML |
|---|---|---|
| الصياغة | مستندة إلى المسافات البادئة | مستندة إلى الوسوم (<tag>...</tag>) |
| أنواع البيانات | أصلية (string وint وbool وnull وfloat) | نص فقط (المخطط يضيف الأنواع) |
| التعليقات | تعليقات سطرية بـ# | تعليقات كتلية بـ<!-- --> |
| الخصائص | لا دعم أصلي | نعم (<tag attr="val">) |
| مساحات الأسماء | غير مدعومة | نعم (xmlns:prefix) |
| حجم الملف | أصغر (بلا وسوم إغلاق) | أكبر (وسوم مطوّلة) |
أمثلة على الكود
كيفية تحويل YAML إلى XML برمجيًا في لغات وبيئات مختلفة:
import { parseDocument } from 'yaml'
import { js2xml } from 'xml-js'
const yamlStr = `
server:
host: localhost
port: 8080
ssl: true
`
const data = parseDocument(yamlStr).toJSON()
const xml = js2xml({ root: data }, { compact: true, spaces: 2 })
console.log(xml)
// → <root>
// → <server>
// → <host>localhost</host>
// → <port>8080</port>
// → <ssl>true</ssl>
// → </server>
// → </root>import yaml
import xml.etree.ElementTree as ET
yaml_str = """
database:
host: db.example.com
port: 5432
credentials:
user: admin
password: secret
"""
data = yaml.safe_load(yaml_str)
def dict_to_xml(tag, d):
elem = ET.Element(tag)
for key, val in d.items():
child = ET.SubElement(elem, key)
if isinstance(val, dict):
child.extend(dict_to_xml(key, val))
elem.remove(child)
elem.append(dict_to_xml(key, val))
else:
child.text = str(val)
return elem
root = dict_to_xml('root', data)
ET.indent(root, space=' ')
print(ET.tostring(root, encoding='unicode'))
# → <root>
# → <database>
# → <host>db.example.com</host>
# → <port>5432</port>
# → ...
# → </database>
# → </root>package main
import (
"encoding/xml"
"fmt"
"gopkg.in/yaml.v3"
)
type Server struct {
XMLName xml.Name `xml:"server"`
Host string `yaml:"host" xml:"host"`
Port int `yaml:"port" xml:"port"`
SSL bool `yaml:"ssl" xml:"ssl"`
}
func main() {
yamlData := []byte("host: localhost\nport: 8080\nssl: true")
var s Server
yaml.Unmarshal(yamlData, &s)
xmlBytes, _ := xml.MarshalIndent(s, "", " ")
fmt.Println(xml.Header + string(xmlBytes))
// → <?xml version="1.0" encoding="UTF-8"?>
// → <server>
// → <host>localhost</host>
// → <port>8080</port>
// → <ssl>true</ssl>
// → </server>
}# Using yq (YAML processor) with xq (XML wrapper around jq) # Install: pip install yq # Convert YAML file to XML yq -x . config.yaml # → <host>localhost</host><port>8080</port> # Pipe inline YAML through conversion echo "name: Alice" | yq -x . # → <name>Alice</name>