حوّل مستندات XML إلى JSON في متصفحك. احتفظ بالسمات تحت مفاتيح مسبوقة بـ @، واجمع العناصر المتكررة في مصفوفات، وحوّل الأرقام والقيم المنطقية والقيم الفارغة اختياريًا.
اقرأ XML كشجرة الكائنات التي أرادت دائمًا أن تكون. الصق مستند XML واحصل على JSON في المقابل. تُحفظ السمات تحت مفاتيح مسبوقة بـ @، وتُجمع العناصر المتكررة في مصفوفات، وتحويل الأنواع اختياري بحيث تحتفظ المعرّفات بأصفارها البادئة.
ناتج JSON
المشاكل الثلاث التي يجب أن يحلّها كل محول من XML إلى JSON
السمات لا مكان طبيعيًا لها
يرسم XML خطًا فاصلًا حازمًا بين السمات والعناصر الفرعية. <user id="7"><name>Ada</name></user> يقول شيئًا مختلفًا عن <user><id>7</id><name>Ada</name></user>، رغم أن معظم التطبيقات تعاملهما بشكل متطابق. لا يوجد في JSON تمييز مكافئ، لذا يجب على المحول إما التخلص من السمات أو ابتكار مكان لها.
الاصطلاح المستخدم على نطاق واسع، والمطبق هنا، هو إضافة بادئة @ لمفاتيح السمات وتخزين نص العنصر تحت #text عندما يحمل العنصر سماتًا ومحتوى معًا. لذا يصبح المثال الأول {"user": {"@id": "7", "name": "Ada"}}. البادئة ليست جزءًا من أي معيار، لكنها شائعة بما يكفي ليتعرف عليها معظم الكود النهائي، وتحافظ على قابلية عكس التحويل. إيقاف تشغيل السمات ينتج ناتجًا أنظف عندما تعرف أن السمات بيانات وصفية لا تحتاجها.
عنصر واحد أم قائمة من عنصر واحد؟
هذه هي المشكلة التي لا إجابة صحيحة لها. في XML، يبدو الأصل الذي لديه طفل <item> واحد والأصل الذي لديه خمسة متشابهين بنيويًا، لكن يجب أن يصبحا كائنًا واحدًا ومصفوفة على الترتيب — ولا شيء في المستند يخبرك بأيهما قصد المخطط. أداة بلا مخطط عليها أن تخمّن مما تراه.
القاعدة هنا هي جمع أسماء العناصر الشقيقة المتكررة في مصفوفة وترك العنصر المنفرد قيمة واحدة. هذا يطابق البديهة عند القراءة، لكنه يعني أن الكود الذي يستهلك الناتج يجب أن يتعامل مع الشكلين، لأن قائمة تصادف وجود إدخال واحد فيها اليوم ستنتج كائنًا لا مصفوفة من عنصر واحد. عندما تتحكم في المستهلك، طبع بـ[].concat(value) قبل التكرار.
كل شيء في XML سلسلة
لا توجد أنواع في مستند XML دون مخطط. <count>42</count> و<sku>0042</sku> كلاهما مجرد نص، وحدها إنسان أو مخطط XSD يعرف أن أحدهما رقم والآخر معرّف يجب أن يحتفظ بأصفاره.
لهذا يكون تحويل الأنواع خانة اختيار وليس الافتراضي. عندما يكون مفعّلاً، تُحوَّل القيم فقط عندما تكون رحلة الذهاب والعودة دقيقة — تتحول السلسلة الرقمية إلى رقم فقط إذا أعاد تنسيقها النص المطابق تمامًا، وهو ما يحمي 0042 و+7 و1e999. تصبح true وfalse والعناصر الفارغة قيمًا منطقية وقيمًا فارغة. عندما يكون متوقفًا، تبقى كل قيمة سلسلة، وهو الخيار الأكثر أمانًا للمعرّفات وأرقام الهواتف والرموز البريدية وأي عدد صحيح يتجاوز 2^53 حيث ستُفسد دقة رقم JavaScript القيمة بصمت.
الأسئلة الشائعة
هل يُرفع XML الخاص بي إلى أي مكان؟
لا. يستخدم التحليل DOMParser المدمج في المتصفح ويُنتج JSON محليًا، لذا لا يغادر المستند الصفحة أبدًا.
كيف تُعرض السمات؟
كمفاتيح مسبوقة بـ @، جنبًا إلى جنب مع عناصر الطفل. إذا كان للعنصر سمات ونص معًا، يُخزن النص تحت مفتاح #text.
لماذا لم يتحول عنصر واحد إلى مصفوفة؟
دون مخطط لا يشير شيء إلى ما إذا كان طفل واحد يعني قيمة واحدة أم قائمة من عنصر واحد. الأسماء المتكررة تصبح مصفوفات؛ العنصر المنفرد يبقى قيمة واحدة.
ماذا يفعل تحويل الأنواع؟
يحوّل القيم الرقمية والمنطقية والفارغة من نص. تُحوَّل الأرقام فقط عندما تكون رحلة الذهاب والعودة دقيقة، لذا تبقى 0042 و+7 سلاسل.
هل يجب أن أترك التحويل متوقفًا؟
نعم للمعرّفات وأرقام الهواتف والرموز البريدية والأعداد الصحيحة التي تتجاوز 2^53، حيث ستقرّب دقة رقم JavaScript القيمة دون تحذير.
لماذا أحصل على خطأ XML غير صالح؟
المستند ليس سليم البنية: وسوم غير مغلقة أو غير متطابقة، أو & أو < غير مهرب، أو أكثر من عنصر جذر واحد هي الأسباب المعتادة.