# مُنسّق XML — انشره أو اضغطه أو حوّله إلى JSON

‏XML منشور ليُقرأ أو مضغوط ليُرسَل، ومحوَّل إلى JSON في الاتجاهين. ولا شيء من ذلك يُلصَق في خادوم أحد آخر.

> نسّق XML وأزِح أسطره واضغطه، وحوّل XML إلى JSON أو JSON إلى XML. المحلّل يعمل في متصفّحك ولا يُرفع شيء، فلا تغادر تغذيةٌ ولا فاتورةٌ ولا ملفُّ إعدادات جهازك أبداً.

هذه الصفحة أداة تفاعلية تعمل بالكامل داخل متصفحك، على العنوان https://abox.tools/ar/تنسيق-xml/ — ولا يُرفَع أي شيء تعطيه إياها. وفيما يلي كل ما تقوله الصفحة عن الأداة بالكلمات؛ لاستخدامها، افتح العنوان.

## ملفات XML وJSON الخاصة بك لا تُرفع **أبدا**. لا يوجد خادم.

التنسيق والتحويل حسابٌ على سلسلة نصية، يجري هنا، في هذه الصفحة. المحلّل مكتوب باليد ويقع في `src/shared/parse-xml.js`، وليس هناك سواه. ولهذه الأداة لا وظيفة شبكية من أي نوع — لا شيء يُجلَب ولا شيء يُرسَل — وذلك يزن هنا أكثر مما توحي به كلمة «XML»: فالذي يصل بهذه الصيغة هو في الغالب فاتورة، أو كشف حساب مصرفي، أو سجلّ صحي، أو طلب SOAP تحمل ترويسته بيانات اعتماد أحدهم.

- ✗ بلا رفع
- ✗ بلا حساب
- ✗ بلا حدّ للحجم
- ✓ يعمل دون اتصال
- ✓ مفتوح المصدر

## كيف تنسّق XML دون رفعه

1. **اختر المهمة.** لسانان وصندوق واحد: *تنسيق* ينشر XML أو يضغطه، و*تحويل* يجعله JSON، أو يعيد JSON إلى XML. وملف XML الذي نشرته للتوّ هو نفسه الذي تحوّله، دون لصقه مرّتين.
2. **الصقه، أو أفلِت الملف.** كلّ ما يمكنك تحديده ونسخه يصلح، وملف `.xml` أو `.svg` أو `.rss` أو `.xsd` تُفلته على المُنتقي يقرؤه متصفّحك أنت ويضعه في الصندوق — ولا توجد خطوة رفع حتى تُترَك.
3. **اختر الإزاحة، أو اضغطه.** مسافتان أو أربع أو مسافة جدولة. والضغط يعطي المستند نفسه دون أي مسافة كانت موجودة للقراءة فحسب، وتقول النتيجة كم بايتاً وفّر ذلك.
4. **اقرأ الخطأ حيث هو.** المحلّل الذي يفشل هنا يقول *أيّ وسم* لم يُغلَق قط، وفي أي سطر وأي عمود، بدل «خطأ في السطر 1»، وهو ما يقوله المتصفّح عن مستند قرأه دفعةً واحدة.
5. **خذ النتيجة.** انسخها، أو نزّلها ملفاً باسم الصيغة التي خرجت بها.

## أيضا في الصندوق

- [مقارن النصوص](https://abox.tools/ar/مقارنة-النصوص/): نصّان يدخلان، وكل فرق يخرج معلَّماً، سطراً سطراً وكلمةً كلمة. ولا شيء يُلصَق في خادم أحد آخر.
- [مرمِّز Base64 ومفكِّكه](https://abox.tools/ar/ترميز-base64/): Base64 والترميز المئوي وكيانات HTML والسداسي عشري وهروبات الشرطة المائلة العكسية، في الاتجاهين. ولا شيء يُلصَق في خادم أحد آخر.
- [مشاركة النص والملفات](https://abox.tools/ar/مشاركة-النص/): المشاركة تعيش في هذا التبويب المفتوح وحده. يستلمها القراء مشفّرة من متصفحك مباشرة، وإغلاق التبويب ينهيها - لا يحتفظ أي خادم بأي شيء.
- [مولّد رموز QR والباركود](https://abox.tools/ar/إنشاء-رمز-qr/): اكتبه، فيصير رمزاً. ولا يُرسَل شيء لصنع واحد.

## أسئلة

### هل يُرفع ملف XML الخاص بي إلى أي مكان؟

لا. المحلّل والطابع في هذه الصفحة دالّتان تعملان في متصفّحك أنت، على عتادك أنت. ولهذه الأداة لا وظيفة شبكية من أي نوع — فهي لا تجلب شيئاً أبداً ولا ترسل شيئاً أبداً — وتسمّي `Content-Security-Policy` الخاصة بالصفحة كلّ عنوان يجوز لها الاتصال به، وليس منها واحد لنا. وهذا يزن في XML أكثر مما توحي به سمعة الصيغة: فالذي يصل فيها هو في الغالب فاتورة، أو كشف حساب مصرفي، أو سجلّ صحي، أو طلب SOAP تحمل ترويسته بيانات اعتماد.

### هل يحلّل الكيانات الخارجية؟

لا، ولا شيء لتعطيله. تحليل الكيانات الخارجية هو الطريقة التي يُستدرَج بها محلّل XML إلى قراءة ملفات من الجهاز الذي يشغّله — الهجوم الذي يُكتَب عادةً XXE — و`src/shared/parse-xml.js` قارئ مكتوب باليد بلا أي تحليل للكيانات. ولا يُسلَّم نصّك كذلك إلى `DOMParser` الخاص بالمتصفّح أبداً. ويُمرَّر `DOCTYPE` دون أن يُنفَّذ قط.

### ماذا يُفقَد عند تحويل XML إلى JSON؟

ترتيب المحتوى المختلط، والتعليقات، والفرق بين السمة والعنصر الابن — وهذا الأخير يُخفَّف لا يُمحى، لأن السمة تصير عضواً يبدأ اسمه بـ `@`. ونصّ العنصر نفسه يصير `#text` متى اضطرّ إلى مشاركة موضعه، والأبناء المتكرّرون يصيرون مصفوفة. وتبقى كلّ قيمة نصاً: فلا أنواع في XML، والبتّ بأن `8080` كان عدداً اختلاقٌ لمعلومة.

### ماذا يُفقَد عند تحويل JSON إلى XML؟

الفرق بين الكائن الفارغ والمصفوفة الفارغة والنصّ الفارغ، وثلاثتها تصير عنصراً فارغاً، ونوع كلّ قيمة، لأن XML بلا أنواع. وتصير المصفوفة عنصراً مكرَّراً، وهو الشكل الوحيد الذي يُقرأ رجوعاً، والمفتاح الذي لا يحتمله اسم عنصر تُستبدَل حروفه العسيرة بدل إخراج مستند لن يقرأه أي محلّل.

### هل يستطيع تنسيق ملف SVG أو تغذية RSS أو ملف POM؟

نعم. ثلاثتها XML، وهذا يقرأ XML لا لهجةً بعينها منه. وملف SVG منشور هكذا أسهل في التحرير باليد؛ وتغذية RSS أو Atom تُرسَل عادةً مضغوطة ولا تُقرأ حتى يفتحها شيء. ولا يغيّر الترتيب شيئاً مما يعنيه المستند.

### هل تغيير الإزاحة يغيّر معنى XML؟

في مستند تحتوي عناصره عناصر أخرى، لا. أما حيث يمكن أن يهمّ فهو النصّ: فالمسافات داخل عنصر يحمل كلمات جزءٌ من ذلك النصّ، ولذلك يُترَك العنصر الذي لا يحمل سوى نصّ في سطر واحد بدل أن يُنشَر. وتُنسَخ أقسام `CDATA` تماماً كما كانت.

### لماذا لا يُستخدَم محلّل XML الخاص بالمتصفّح؟

بسبب ما يقوله حين يكون المستند معطوباً. فـ`DOMParser` يعيد مستند خطأ تختلف صياغته في كلّ متصفّح وكثيراً ما تنتهي إلى «خطأ في السطر 1». أما القارئ المكتوب باليد فيستطيع أن يقول أيّ وسم لم يُغلَق قط، وأين فُتح، وهو ما كنت تحتاج فعلاً إلى معرفته. وعدم تحليل الكيانات الخارجية هو السبب الآخر.

### ما حجم الملف الذي يستطيع التعامل معه؟

لا حدّ موضوع هنا، لأنه لا خادوم يدفع ثمنه. السقف العملي هو جهازك أنت: بضعة ميغابايتات من XML تمرّ على ما يرام، ومع مستند طويل جداً تنتظر الصفحة توقّفاً في كتابتك قبل أن تعيد التنسيق، بدل أن تنازعك لوحة المفاتيح.

### هل هو مجاني، وهل أحتاج إلى حساب؟

هو مجاني، ولا حساب ولا تسجيل دخول ولا فترة تجريبية ولا حدّ لما تلصقه. يحمل الموقع إعلانات، وهي ما يدفع تكاليفه؛ ولا تُعطى تلك الإعلانات شيئاً عن نصّك.

### هل يعمل دون اتصال؟

نعم. حمّل الصفحة مرة واحدة، ثم افصل الإنترنت وستظلّ تعمل. وهذه أيضاً أبسط طريقة لإثبات أن شيئاً لا يُرفَع: فأداة ترسل XML بعيداً لتنسيقه كانت ستتوقّف في اللحظة التي تفصل فيها.

## كيف يمكن التحقق من وعد الخصوصية

- **ما تلصقه ليس له مكان يذهب إليه.** تسمّي Content-Security-Policy كلّ عنوان يجوز لهذه الصفحة الاتصال به، وليس منها واحد لنا. لا توجد هنا نقطة نهاية يمكن أن تُجمَع عندها فاتورةٌ ملصوقة، ولا في الشيفرة ما يرسلها إليها لو وُجدت.
- **لا شيء هنا يجلب شيئاً.** ليس في `src/` كلّه `fetch` ولا `XMLHttpRequest` ولا `sendBeacon`. المحلّل والطابع دالّتان في هذه الصفحة تأخذان سلسلة نصية وتعيدان سلسلة نصية.
- **لا تُحلَّل الكيانات الخارجية أبداً.** إنّ `DOCTYPE` يحوي كياناً خارجياً هو الطريقة التي يُستدرَج بها محلّل XML إلى قراءة ملف من الجهاز الذي يحلّل، وهي أقدم ثغرات الصيغة. و`src/shared/parse-xml.js` قارئ مكتوب باليد لا يتضمّن أي تحليل للكيانات على الإطلاق — لا معطَّلاً بل غائباً — وهذه الصفحة لا تسلّم نصّك أبداً إلى `DOMParser` الخاص بالمتصفّح.
- **كلّ قيمة تخرج من XML نصّ.** `<port>8080</port>` لا يقول شيئاً عمّا إذا كان ذلك عدداً، فيقول JSON `"8080"`. والبتّ في ذلك نيابةً عنك اختلاقٌ لمعلومة تسافر بعدها كأنها كانت في الملف.
- **ما تحمّله Google، وما لا يُعطى لها.** تأتي نصوص الإعلانات والقياس من Google، وزرّ التبرّع من Buy Me a Coffee. ولا يُسلَّم أيٌّ منها حرفاً من نصّك. وكلّ سطر يقرؤه أو يحلّله أو يكتبه يُقدَّم من هذا الأصل ومُدرَج في المستودع.
- **يعمل دون اتصال.** افصل الشبكة وتبقى الأداة كما هي، لأنه لم تكن فيها خطوة شبكية أصلاً. وهذا أبسط برهان على الإطلاق.

**تحقّق بنفسك.** لا شيء مما سبق عليك تصديقه دون تحقق. تُولَّد هذه الصفحة من القوالب والإعدادات في المستودع بواسطة سكربت بناء يمكنك قراءته وتشغيله بنفسك، والنتيجة موجودة في فرع `dist` — فقارِن إذن بين ما يُقدَّم فعلا وما ينتجه بناء المصادر: https://github.com/A-Box-of-Tools/website

الملفات الجديرة بالقراءة أولا هي `config/site.toml` من أجل سياسة أمان المحتوى (Content-Security-Policy)، و`src/shared/parse-xml.js` للمحلّل الذي يقول لك أيّ وسم لم يُغلَق قط، و`src/convert.js` لسبب خروج كلّ قيمة من XML نصاً بدل أن تُخمَّن.
