أدوات المطور · محولات بناء الجملة
تعيين XML إلى JSON: السمات والعقد النصية ومشكلة واحد مقابل متعدد
· كيف يعمل
xml json تنسيقات البيانات
لا توجد طريقة واحدة صحيحة لتحويل XML إلى JSON، لأن XML له سمات ومحتوى مختلط وعناصر فرعية مرتبة يفتقر إليها JSON. يشرح هذا المنشور اصطلاحات رسم الخرائط الشائعة والمصائد الموجودة في كل منها.
لماذا أصبح <item> كائنًا واثنان أصبحا مصفوفة - الخلاصة XML التي يتغير شكلها JSON اعتمادًا على عدد الإدخالات الموجودة فيها
الخلاصة التي تحتوي على `<item>one</item>` تنتج `"item": "one"`؛ تؤدي إضافة شقيق ثانٍ إلى تغيير هذه الخاصية إلى `"item": ["one", "two"]`. لا يمكن للمحلل أن يستنتج أن أحد العناصر كان من الناحية النظرية قائمة من عنصر واحد لأن كلا المعنيين لهما بناء جملة XML متطابق. ولذلك يمكن أن تفشل التعليمات البرمجية المبنية على العينة الأولى فقط عندما يرسل الإنتاج العينة الثانية.
ToolAcre لا يخفي عدم الاستقرار هذا خلف خيار المصفوفة دائمًا. يقوم بتسجيل الاسم مرة واحدة كقيمة واحدة والأشقاء المتكررين كمصفوفة. من السهل فحص هذا التعيين المباشر، ولكن يجب على المستهلكين الذين يحتاجون إلى شكل مجموعة مستقر استخدام معرفة المخطط أو تسوية النتيجة بأنفسهم بعد التحويل.
ما الذي يحتوي عليه XML والذي لا يحتوي عليه JSON - السمات والنص الممزوج بالعناصر والأخوة المرتبة ومساحات الأسماء والتعليقات وتعليمات المعالجة
XML يفصل السمات عن العناصر الفرعية، ويحافظ على ترتيب الأخوة، ويسمح بالنص بين العناصر، ويحمل بادئات مساحة الاسم، ويمكن أن يحتوي على تعليقات وتعليمات معالجة. يقدم JSON كائنات ومصفوفات ولكن لا يحتوي على مرادفات مضمنة لفئات العقد هذه. أي نتيجة من XML-to-JSON هي بالتالي إسقاط مختار، وليست ترجمة عالمية.
يسقط هذا القارئ الإقرار والتعليقات وتعليمات المعالجة. تظل بادئات مساحة الاسم حرفية بدلاً من أن يتم حلها: `<ns:item>` يصبح المفتاح `ns:item`، بينما `xmlns:ns` يصبح `@xmlns:ns`. يتم ضم النص المختلط تحت مفتاح واحد، لذلك يتم فقدان موضعه الأصلي حول العناصر الفرعية ويظهر تحذير يفيد بأن التحويل لا يمكن أن يتم ذهابًا وإيابًا.
اصطلاحات السمات - البادئات مثل @ أو $، وسبب وجودها، وكيفية تصادم سمة وعنصر فرعي يحمل نفس الاسم
تستخدم السمات البادئة `@`. `<user id="7"><id>other</id></user>` يصبح كائنًا مع `@id` يساوي `"7"` والطفل `id` يساوي `"other"`. تمنع البادئة بنيتين مختلفتين XML من الاصطدام في خاصية كائن واحد. ويصبح أيضًا جزءًا من عقد المحول عندما تتم إعادة كتابة JSON إلى XML.
قد تستخدم المكتبات الأخرى `$`، أو كائن سمات أو اتفاقية أخرى. ToolAcre يدعم فقط التعيين `@` المرئي. سيؤدي تغيير هذه البادئة في كود التطبيق دون تغيير الكاتب إلى تحويل السمات إلى عناصر، لذا احتفظ بها عند استخدام القيمة المحولة كنموذج فحص وسيط.
اصطلاحات عقدة النص - #text أو _ لمحتوى العنصر، وماذا يحدث عندما يحتوي العنصر على نص وعناصر فرعية
ينهار العنصر الذي يحتوي على نص فقط إلى تلك السلسلة. عند وجود السمات أو العناصر الفرعية أيضًا، يظل النص تحت `#text`؛ يتم الاحتفاظ بـ CDATA بشكل منفصل ضمن `#cdata`. تصبح علامة الإغلاق الذاتي سلسلة فارغة. تتيح هذه المفاتيح المحجوزة للكاتب التمييز بين أسماء الأطفال العادية وفئات المحتوى التي لا يحددها JSON بنفسه.
يبقى المحتوى المختلط ضائعًا. في `<p>before<b>bold</b>after</p>`، لا يمكن إعادة بناء موضع "قبل" و"بعد" بالنسبة للتابع من خاصية `#text` المرتبطة. تكتشف الأداة هذا النمط الهيكلي وتحذر. استخدم عقدة الحفاظ على XML API عندما يكون ترتيب المستند جزءًا من المعنى.
مشكلة واحد مقابل متعدد — العناصر المتكررة تصبح مصفوفات فقط عند تكرارها، ولماذا يجب على المستهلكين البرمجة بشكل دفاعي
الأشقاء المتكررون يتحولون إلى صفائف فقط بعد ملاحظة التكرار. `<book>` واحد هو كائن واحد؛ كتابان عبارة عن مجموعة من الأشياء. يُطلق على هذا أحيانًا اسم مشكلة واحد مقابل متعدد، ولكنه ليس عيبًا في المحلل اللغوي. لا يحتوي المستند المصدر ببساطة على إعلان قائمة مستقل عن تكراراته.
يمكن للمستهلكين الدفاعيين تسوية المسارات المعروفة باستخدام معرفة المخطط: قم بلف `catalogue.book` عندما لا يكون مصفوفة بالفعل. لا تطبق هذه القاعدة على كل خاصية، لأن العدد القياسي العادي لا ينبغي أن يصبح مجرد قائمة للتناظر. يتجنب المحول عمدا اختراع معلومات المجال هذه.
مثال عملي: تحويل مستند صغير بنمط RSS - سمات وعنصر متكرر ومساحة اسم، مع التعليق التوضيحي الناتج JSON
تحويل `<feed xmlns:m="https://example.invalid/meta"><item id="1"><m:title>One</m:title></item><item id="2"><m:title><![CDATA[Two & More]]></m:title></item></feed>`. الجذر هو `feed`؛ `@xmlns:m` يحتفظ بإعلان مساحة الاسم؛ `item` عبارة عن مصفوفة؛ كل `@id` عبارة عن نص؛ ويحتوي العنوان الثاني على `#cdata`.
يتم إيقاف استنتاج النوع بشكل افتراضي، لذلك حتى `id="2"` تظل السلسلة `"2"`. يتيح تمكين الاستدلال للمحلل قراءة النص الرقمي والمنطقي مثل تلك الأنواع JavaScript، ولكن XML لم يعلن عن هذه النية. الخيار عبارة عن تخمين يتحكم فيه المستخدم، وليس دليلاً يوفره المستند.
ما لا يغطيه هذا هو التحويل المستند إلى المخطط والذي يعرف أن العنصر هو دائمًا قائمة، الأمر الذي يتطلب XSD أو تعيينًا يدويًا
لم يتم تحميل XSD، ولا تتوفر معلومات قائمة تعتمد على المخطط. لا يمكن للمحول معرفة أن العنصر قابل للتكرار عند ظهور عنصر واحد فقط، أو التحقق من صحة العناصر الفرعية المطلوبة، أو تحليل معرفات URI لمساحة الاسم في أنواع التطبيقات أو إنشاء عميل مكتوب. يؤدي التحليل الناجح فقط إلى إنشاء XML جيد التصميم ومقبول من قبل القارئ الذي تم تكوينه.
DOCTYPE يتم رفض التصريحات قبل التحليل، بما في ذلك التصريحات غير الضارة. يمنع هذا الحد طلبات الكيانات الخارجية وقراءات الملفات المحلية وتوسيع الكيان. قد تؤدي إزالة DOCTYPE أيضًا إلى إزالة الإعلانات التي يعتمد عليها المستند، لذلك لا تفعل ذلك إلا عندما تمتلك البيانات وتفهم العواقب.
الوجبات الجاهزة: XML إلى JSON عبارة عن تعيين، وليس ترجمة - وكيف تتيح لك لوحة محولات Syntax فحص هذا التعيين في متصفحك
تعامل مع النتيجة على أنها تعيين موثق لـ ToolAcre: `@` للسمات، `#text` لنص العناصر المختلطة، `#cdata` لـ CDATA، المصفوفات بعد الأشقاء المتكررين وبادئات مساحة الاسم الحرفية. تجعل هذه القواعد المخرجات قابلة للتنبؤ بها دون التظاهر بأن XML وJSON يشتركان في نموذج بيانات واحد.
للفحص، هذا الإسقاط سريع وسهل القراءة. للحصول على تكامل دائم، قم باختبار حدث واحد أو أكثر، والسمات التي تشارك الأسماء مع الأطفال، والعناصر الفارغة، والمحتوى المختلط، ومساحات الأسماء. إذا كان ترتيب العناصر أو قيود المخطط مهمًا، فقم بتحليل XML مقابل هذا العقد بدلاً من الاعتماد على شكل محول عام.
احتفظ بتركيبة XML الأولية بجانب التوقع الطبيعي. يحافظ هذا الاقتران على الأدلة إذا أدت ترقية التبعية إلى تغيير معالجة المصفوفة أو قطع المسافات البيضاء أو فك تشفير الكيان. كما أنه يمنح المراجعين مكانًا لرؤية الفروق التي لا يمكن أن يحملها عرض JSON. لا يمكن للكائن المحول وحده إثبات ما إذا كانت السلسلة الفارغة جاءت من عنصر الإغلاق الذاتي أو العلامات المقترنة أو اتفاقية أخرى في المصدر.