Command Palette

Search for a command to run...

محول JSON إلى XML: كيفية تعيين المفاتيح والسمات والمصفوفات بشكل صحيح

محول JSON إلى XML: كيفية تعيين المفاتيح والسمات والمصفوفات بشكل صحيح

T
Toolz Team
|Jul 20, 2026|16 دقيقة قراءة

جزء من مجموعة أدوات البيانات

النموذجان لا يصطفان: RFC 8259 يحدد ستة أنواع من JSON بدون سمات، بينما XML 1.0 يحتوي على سمات ومساحات أسماء ومحتوى مختلط مرتب. الذهاب في هذا الاتجاه يعني اختيار ما يجب فعله مع الفرق.

في المرة الأولى التي اضطررت فيها إلى إرسال بيانات JSON إلى نظام يتحدث لغة XML فقط، فعلت الشيء الساذج: لقد كتبت يدويًا الأقواس الزاوية في محرر النصوص. لقد كان موجز المورد هو الذي توقع وجود مظروف SOAP-ish، وكان مصدري عبارة عن مصفوفة JSON مرتبة تخرج من واجهة برمجة تطبيقات Laravel. بعد مرور عشرين دقيقة، قمت بعدم مطابقة علامة الإغلاق في مكان ما حول السجل الأربعين وألقى المحلل اللغوي المتلقي &quot؛ غير المرغوب فيه بعد عنصر المستند وحاصل الاقتباس؛ خطأ لم يخبرني بشيء عنه أين. علمني ذلك المساء درسًا قمت بتطبيقه على كل تكامل منذ ذلك الحين: التحويل بين JSON وXML ليس عملاً إبداعيًا. إنها مشكلة رسم خرائط مع عدد صغير من القواعد، وفي اللحظة التي تكتب فيها هذه القواعد، يصبح الأمر برمته ميكانيكيًا.

هذا الدليل هو إصدار هذا التعيين الذي أتمنى أن يكون I&#39؛d. لقد قمت ببناء [Toolz.dev](/، وإحدى الأدوات هناك تعتمد على المتصفح محول JSON إلى XML وهذا ينطبق بالضبط على الاتفاقيات أدناه. لكن الهدف من هذه المقالة ليس الزر - فهم it&#39؛ لماذا يصبح المفتاح عنصرا، لماذا @- يصبح المفتاح الذي يسبقه سمة، ولماذا يتحول المصفوفة إلى علامات متكررة بدلاً من قائمة مرقمة. بمجرد النقر على هذه الأفكار الثلاثة، يمكنك تحويل أي JSON إلى XML يدويًا إذا كان عليك ذلك، ويمكنك تصحيح أخطاء الإخراج عندما يرفضه النظام النهائي.

ليرة تركية؛DR: لتحويل JSON إلى XML، قم بتعيين كل مفتاح كائن إلى عنصر، كل منهما @- مفتاح مسبوق لسمة على العنصر الأصلي، و #text مفتاح العنصر والمحتوى النصي #39؛s. قم بتوسيع كل مصفوفة إلى عناصر شقيقة متكررة تشترك في اسم المفتاح &#39؛s. يهرب &، <، و > في النص (زائد " في قيم السمات)، وقم بتطهير أي مفتاح يمثل &#39؛ اسم XML قانوني. افعل ذلك في المتصفح حتى لا تغادر الحمولات التي تحتوي على الرموز المميزة أو بيانات العميل جهازك أبدًا.

لماذا تقوم بتحويل JSON إلى XML في المقام الأول؟

فازت JSON بحرب واجهة برمجة تطبيقات الويب منذ سنوات، وإذا كنت تقضي أيامك في React أو Laravel أو Node، فقد تسأل بشكل معقول متى تحتاج إلى XML &#39 على الإطلاق. الجواب هو: باستمرار، ولكن ليس في الأماكن التي تبحث عنها. XML هي اللغة المشتركة لقاعدة ضخمة مثبتة من الأنظمة التي تسبق عصر JSON ولن تذهب إلى أي مكان. تحمل خدمات الويب SOAP - التي لا تزال العمود الفقري للخدمات المصرفية والتأمين والخدمات اللوجستية والتكاملات الحكومية - حمولاتها بتنسيق XML. خلاصات RSS وAtom هي XML. خرائط الموقع هي XML. تخطيطات أندرويد، .docx و .xlsx الأجزاء الداخلية (Office Open XML)، وSVG، وموجزات البودكاست RSS، وعدد لا يحصى من التبادلات على نمط B2B EDI كلها XML.

لذا فإن سيناريو العالم الحقيقي يكون دائمًا بنفس الشكل تقريبًا: لديك بيانات في JSON لأن هذا &#39؛ هو ما تنتجه مجموعتك، وأنت في حاجة إليها في XML لأن هذا &#39؛ هو ما يطلبه الجانب الآخر. ربما أنت و#39؛ تدفعان بيانات المنتج إلى السوق الذي يقبل موجز XML فقط. ربما أنت و#39؛ إعادة تغليف استجابة واجهة برمجة التطبيقات في نص SOAP. ربما أنت و#39؛ تقومان بإنشاء موجز RSS من تصدير محتوى JSON. في كل حالة، لا تريد &#39؛ إعادة اختراع التسلسل في كل مرة - فأنت تريد قاعدة يمكن التنبؤ بها تحول أي بنية JSON إلى XML صالح، حتى تتمكن من أتمتتها والتوقف عن التفكير فيها.

هناك &#39؛s أيضًا سبب أكثر هدوءًا: سهولة القراءة أثناء تصحيح الأخطاء. عندما &#39؛ يحدق في نقطة JSON متداخلة بعمق ويحاول فهم التسلسل الهرمي، وتحويله إلى XML ذي مسافة بادئة يؤدي أحيانًا إلى قفز بنية الشجرة، لأن علامات XML&#39؛ المفتوحة/المغلقة تجعل التداخل واضحًا بطريقة تجعل JSON&#39؛s الأقواس don&#39؛t. أحافظ على محول JSON إلى XML والعكس محول XML إلى JSON افتح في علامات التبويب المجاورة أكثر من I&#39؛ لقد خمنت.

كيف يتم تعيين JSON إلى XML بالضبط؟

وهنا جوهرها. هناك أربع قواعد فقط، وكل شيء آخر هو التفاصيل.

القاعدة 1: تصبح مفاتيح الكائنات عناصر. كائن JSON { "book": { "title": "..." } } يصبح <book><title>...</title></book>. المفتاح هو اسم العلامة؛ القيمة هي ما يدخل في الداخل.

القاعدة 2: @-المفاتيح البادئة تصبح سمات. يمكن لعناصر XML أن تحمل سمات، وليس لدى JSON مفهوم أصلي لها، لذلك نحن بحاجة إلى اتفاقية. الحرف المستخدم على نطاق واسع - والذي تستخدمه أداتي - هو حرف بادئة، @ افتراضيا. لذا { "book": { "@id": "bk101", "title": "..." } } يصبح <book id="bk101"><title>...</title></book>. يمكن للسمات أن تحتوي فقط على قيم بدائية (سلاسل، أرقام، قيم منطقية)، ولا تحتوي أبدًا على هياكل متداخلة، مما يطابق كيفية عمل سمات XML فعليًا.

القاعدة 3: #text يصبح المفتاح محتوى نصيًا. عندما يحتاج العنصر كلاهما السمات والنص - فكر <title lang="en">Hello</title> - يمكنك &#39؛ التعبير عن ذلك بقيمة سلسلة عادية، لأن السلسلة لا تترك مجالًا للسمة. الاتفاقية هي مفتاح محجوز، #text: { "title": { "@lang": "en", "#text": "Hello" } }. إذا كان العنصر يحتوي على نص فقط ولا يحتوي على سمات، فيمكنك التخطي #text واستخدم فقط قيمة سلسلة عادية.

القاعدة 4: تصبح المصفوفات عناصر متكررة. هذا هو الشيء الذي يخطئ فيه الأشخاص في أغلب الأحيان. لا يحتوي XML على نوع مصفوفة. يتم التعبير عن قائمة الأشياء كعناصر شقيقة متكررة بنفس اسم العلامة. لذا { "tags": { "tag": ["computer", "web"] } } يصبح <tags><tag>computer</tag><tag>web</tag></tags> - لا <tag>0</tag> أو أي هراء قائم على الفهرس. المصفوفة &#39؛s مفتاح يوفر اسم العلامة المتكرر.

ضعها معًا على كائن واقعي والإخراج هو بالضبط ما يتوقعه محلل XML النهائي

{
  "catalog": {
    "book": [
      { "@id": "bk101", "author": "Gambardella, Matthew", "price": 44.95 },
      { "@id": "bk102", "author": "Ralls, Kim", "price": 5.95 }
    ]
  }
}

يصبح

<?xml version="1.0" encoding="UTF-8"?>
<catalog>
  <book id="bk101">
    <author>Gambardella, Matthew</author>
    <price>44.95</price>
  </book>
  <book id="bk102">
    <author>Ralls, Kim</author>
    <price>5.95</price>
  </book>
</catalog>

لاحظ أن مفتاح المستوى الأعلى الفردي، catalog، أصبح العنصر الجذري للمستند &#39؛s. هذا &#39؛s متعمد: يجب أن يحتوي مستند XML جيد التكوين على جذر واحد بالضبط. عندما يكون لدى JSON الخاص بك بالفعل مفتاح تغليف واحد، فهذا المفتاح يكون الجذر. عندما لا يحدث ذلك &#39؛t - عندما تقوم بتسليم المحول كائنًا متعدد المفاتيح أو مصفوفة عارية - تقوم الأداة بتغليف كل شيء تحت عنصر جذر قابل للتكوين (root افتراضيًا) بحيث يظل الإخراج جيدًا.

ماذا عن الهروب والأسماء غير الصالحة؟

هناك شيئان يكسران التحويلات بهدوء أكثر من أي خطأ متداخل: الأحرف الخاصة التي لم يتم الهروب منها وأسماء العناصر غير القانونية.

الهروب. يحتفظ XML بعدد قليل من الأحرف. داخل نص العنصر، &، <، و > يجب أن تكتب كما &amp;، &lt;، و &gt;. داخل قيمة السمة ذات الاقتباس المزدوج، يتعين عليك أيضًا الهروب من الاقتباس المزدوج كـ &quot;. إذا كانت سلسلة JSON الخاصة بك تحتوي على Tom & Jerry وتقوم بإسقاطه في XML الخام، حيث تؤدي علامة العطف العارية إلى تشويه المستند ونفاد المحلل اللغوي. يهرب المحول الصحيح تلقائيًا، لذلك "a < b & c" يصبح a &lt; b &amp; c في الإخراج ورحلات العودة إلى النص الأصلي عند التحليل. هذه ليست عملية تلميع اختيارية - it&#39؛s الفرق بين XML الصالح وغير الصالح.

أسماء العناصر. لدى XML قواعد صارمة بشأن ما قد يحتوي عليه اسم العلامة. يمكن أن تتضمن الأسماء &#39؛t مسافات، ويمكن &#39؛t تبدأ برقم أو واصلة أو فترة، وتستبعد معظم علامات الترقيم. مفاتيح JSON ليس لها مثل هذه القيود - "first name"، "123"، و "total($)" كلها مفاتيح JSON قانونية تمامًا وجميع أسماء XML غير القانونية. المحول الذي يتجاهل هذا ينتج مستندات لن يقبلها أي محلل. الإصلاح العملي، وما تفعله أداتي، هو التطهير: استبدال الأحرف غير القانونية بشرطات سفلية وإضافة شرطة سفلية مسبقًا عندما يبدأ الاسم برقم. لذا "123 bad" يصبح <_123_bad>. It&#39؛s ليست براقة، ولكنها تضمن تحليل الإخراج، وهو الهدف بأكمله.

كيف يمكنني استخدام المحول المستند إلى المتصفح؟

سير العمل على Toolz.dev/tools/json-to-xml يعكس القواعد المذكورة أعلاه، مع بعض الخيارات لحالات الحافة العملية.

الصق JSON الخاص بك في الإدخال واضغط على تحويل. إذا كان JSON الخاص بك مشوهًا، فستحصل على خطأ تحليل واضح بدلاً من البيانات المهملة الصامتة - وأنا أعتمد على المتصفح &#39؛s الخاص JSON.parse، لذا فإن رسائل الخطأ تتطابق مع ما تريد &#39؛d انظر في وحدة التحكم الخاصة بك. اختر 2 أو 4 مسافات للمسافة البادئة عندما تريد مستندًا يمكن قراءته بواسطة الإنسان للمراجعة، أو اختر Minify لطي الأمر برمته في سطر واحد عندما تقوم &#39؛ بإعادة شحنه عبر السلك ويتم احتساب كل بايت (طلبات SOAP وحمولات التغذية بشكل خاص). قم بتعيين اسم العنصر الجذر للحالة التي لا يحتوي فيها JSON على مفتاح تغليف واحد. تبديل إعلان XML (<?xml version="1.0" encoding="UTF-8"?>) تشغيل أو إيقاف اعتمادًا على ما إذا كان المستهلك يتوقع prolog. وتحديد ما إذا كان يجب أن تغلق العقد الفارغة ذاتيًا <tag/> أو التوسع في <tag></tag> - بعض المستهلكين الصارمين يهتمون.

كل شيء يعمل من جانب العميل. المحول عبارة عن مُسلسل خالٍ من التبعية مكتوب بلغة TypeScript، وليس غلافًا حول واجهة برمجة التطبيقات البعيدة. وهذا مهم أكثر مما يبدو: تحتوي استجابات واجهة برمجة التطبيقات وملفات التكوين بشكل روتيني على رموز الوصول وسجلات العملاء والمعرفات الداخلية و&quot؛ محول واقتباس مجاني عبر الإنترنت؛ الذي ينشر حمولتك إلى خادم شخص ما &#39؛ هو تسرب بيانات في انتظار حدوثه. نظرًا لأن هذا الخادم لا يقوم أبدًا بإجراء مكالمة عبر الشبكة، فيمكنك تحويل البيانات الحساسة بأمان، ويستمر في العمل دون أي اتصال على الإطلاق. إذا كانت الخصوصية في أدوات المتصفح شيئًا تفكر فيه - وإذا كنت تتعامل مع بيانات أشخاص آخرين و#39؛، فيجب أن تكون كذلك - لقد كتبت المزيد عنها في دليل أدوات خصوصية البيانات.

JSON مقابل XML: مقارنة سريعة

يساعد على الحفاظ على التنسيقين &#39؛ المقايضات في الاعتبار، لأن سبب يحتاج رسم الخرائط إلى اصطلاحات مثل @ و #text هو أن XML يمكنه التعبير عن الأشياء التي يستطيعها JSON &#39؛t، والعكس صحيح.

جانب JSON XML
سمات لا يوجد مفهوم أصلي الدرجة الأولى (<tag attr="v">)
المصفوفات / القوائم أصلي [ ] يكتب عناصر الأخوة المتكررة
تعليقات غير مسموح <!-- ... --> مدعوم
مساحات الأسماء لا أحد دعم مساحة الاسم الكاملة
محتوى مختلط (نص + عناصر) محرج أصلي
المخطط / التحقق من الصحة مخطط JSON (إضافة) XSD، DTD، RELAX NG (ناضج)
اللفظ مدمج أكثر تفصيلاً (علامات الإغلاق)
الاستخدام النموذجي اليوم واجهات برمجة تطبيقات الويب، التكوين الصابون والأعلاف والمستندات والمؤسسة

ال @ البادئة موجودة لجسر &quot؛ السمات والاقتباس؛ صف؛ تعمل قاعدة العلامات المتكررة على سد &quot؛ المصفوفات والاقتباس؛ صف؛ و #text الجسور &quot؛ محتوى مختلط وحاصل؛ صف. بمجرد أن ترى التعيين كجسر عبر هذه الفجوات المحددة، فإنه يتوقف عن الشعور بالتعسف.

هل JSON إلى XML ذهابًا وإيابًا نظيف؟

في الغالب، نعم - وهذا &#39؛s حسب التصميم. بلدي json إلى xml و XML إلى JSON الأدوات تشترك في نفس الشيء @ بادئة السمة و #text مفتاح المحتوى، لذا فإن تحويل XML → JSON والعودة يعيد إنتاج المستند الأصلي بشكل عام. إذا كنت &#39؛ إعادة بناء خط أنابيب يجب عليه نقل البيانات في كلا الاتجاهين، فإن هذا التماثل يستحق الاعتماد عليه.

حيث يصبح التعثر الدائري غامضًا هو نفس المكان الذي يصبح فيه كل تعيين JSON/XML غامضًا: الترتيب والمحتوى المختلط. كائنات JSON غير مرتبة رسميًا، لذلك قد لا يحافظ المحول على الترتيب الشقيق الدقيق للعناصر ذات الأسماء المختلفة. XML الذي يشذر النص والعناصر الفرعية (<p>Hello <b>world</b>!</p>) لا &#39؛ يحتوي على تمثيل JSON نظيف ويعود كتقريب. والعنصر الذي يظهر أحيانًا مرة واحدة وأحيانًا يظهر عدة مرات غامض - هل هو قيمة واحدة أم مصفوفة واحدة؟ هذه هي &#39؛أخطاء في أي أداة معينة؛ هم &#39؛ متأصلون في حقيقة أن نموذجي البيانات لا يتداخلان تمامًا. تتيح لك معرفة مكان وجود اللحامات تصميم JSON الخاص بك بحيث يظل التحويل بدون فقدان: كن متسقًا بشأن ما إذا كان الشيء دائمًا مصفوفة، وتجنب المحتوى المختلط حيثما أمكنك ذلك.

إذا كنت تعمل مع JSON كثيرًا، فإن &#39؛s تستحق بناء الطلاقة عبر جميع أفراد عائلة التحويلات - لقد جمعت تلك التي أصل إليها كثيرًا في الدليل النهائي لأدوات JSON، والأوسع دليل أدوات الترميز يغطي المكان الذي تتناسب فيه محولات التنسيق مع سير العمل اليومي. للاتجاه العكسي والتنسيقات المجاورة، محول JSON إلى YAML وسهل منسق JSON تقريب المجموعة.

الأخطاء الشائعة عند تحويل JSON إلى XML

بعض الفخاخ I&#39؛ لقد ضربت أو شاهدت الآخرين يضربون:

التعامل مع مؤشرات المصفوفة كأسماء علامات. إذا رأيت <item0>، <item1> في مخرجات شخص ما &#39؛، قاموا ببناء المحول بشكل خاطئ. تصبح المصفوفات تكرار العلامات مع نفس الاسم مأخوذ من مفتاح array&#39؛s.

نسيان أنه يمكن أن يكون هناك جذر واحد فقط. يؤدي تسليم كائن متعدد المفاتيح مباشرة إلى جهاز التسلسل دون تغليفه إلى إنتاج عناصر متعددة ذات مستوى أعلى، وهو ليس مستندًا جيد التكوين. لفها.

تخطي الهروب والاقتباس؛ لأن البيانات تبدو نظيفة.&اقتباس؛ يبدو نظيفًا حتى يحتوي وصف منتج واحد على علامة الضم أو علامة العطف <. الهروب دائما؛ لا تفترض أبدا.

وضع البيانات المنظمة في السمات. السمات تحمل البدائيات. إذا حاولت دفع كائن متداخل إلى @- المفتاح الذي يسبقه، المحول الصحيح سوف (ويجب) إسقاطه أو تجاهله، لأنه لا يوجد XML صالح له. قم بتصميمه كعنصر فرعي بدلاً من ذلك.

متقدم: اختيار المسافة البادئة والإعلان للمستهلك

إحدى العادات التي أنقذتني تكررت ذهابًا وإيابًا مع شركاء التكامل: مطابقة المخرجات بالضبط إلى ما يتوقعه المستهلك، ثم توقف. ترفض بعض نقاط نهاية SOAP مستندًا يتضمن علامة ترتيب بايت أو سجلًا غير متوقع؛ والبعض الآخر يتطلب <?xml ... ?> الإعلان و 415 أنت بدونه. يريد بعض مدققي الخلاصات XML مطبوعًا بشكل جميل ومسافة بادئة لتصحيح الأخطاء الخاصة بهم؛ تريد معظم وسائل نقل الإنتاج تصغيرها. بدلاً من الجدال، أقوم بإنشاء أي متغير تطلبه المواصفات. That&#39؛ ولهذا السبب يكشف المحول عن المسافة البادئة (بما في ذلك خيار التصغير)، وتبديل الإعلان، وسلوك الإغلاق الذاتي كعناصر تحكم من الدرجة الأولى - هم &#39؛ ليسوا زخرفة، إنهم &#39؛ هي المقابض التي تحدد ما إذا كان المستهلك الذي يصعب إرضاءه يقبل مستندك في المحاولة الأولى.

أسئلة وأجوبة

كيف أقوم بتحويل JSON إلى XML؟

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

كيف يتم تمثيل سمات JSON في XML؟

وفقًا للاتفاقية، فإن أي مفتاح كائن يبدأ بـ &quot؛@&quot؛ تتم كتابة البادئة كسمة على العنصر الأصلي وليس كعنصر فرعي. على سبيل المثال، {&quot؛book&quot؛: {&quot؛@id&quot؛: &quot؛bk101&quot؛، &quot؛title&quot؛: &quot؛...&quot؛}} يصبح .... يعكس هذا كيفية قراءة أداة XML إلى JSON للسمات مرة أخرى.

كيف يتعامل المحول مع صفيفات JSON؟

ينبعث كل عنصر من عناصر المصفوفة كعنصر شقيق متكرر يشارك المفتاح &#39؛s الاسم. إذن {&quot؛tags&quot؛: {&quot؛tag&quot؛: [&quot؛a&quot؛، &quot؛b&quot؛]}} ينتج أب، وهي الطريقة التي يتم بها التعبير عن القوائم بشكل تقليدي بتنسيق XML - لا يوجد فهرس مرقم أو عنصر غلاف لكل عنصر.

ما هو مفتاح #Text ل؟

عندما يحتاج العنصر إلى كل من السمات والمحتوى النصي، يتم تخزين النص ضمن &quot؛#text&quot؛ مفتاح. {&quot؛title&quot؛: {&quot؛@lang&quot؛: &quot؛en&quot؛، &quot؛#text&quot؛: &quot؛Hello&quot؛}} يصبح مرحبًا. إذا كان العنصر يحتوي على نص فقط ولا يحتوي على سمات، فيمكنك استخدام قيمة سلسلة عادية بدلاً من ذلك.

هل يمكنني الحصول على XML مصغر بدلاً من الإخراج البادئة؟

نعم. اضبط المسافة البادئة على 0 (تصغير) ويصدر المحول المستند بأكمله على سطر واحد بدون مسافة بيضاء بين العلامات. هذا مفيد لطلبات الصابون أو الخلاصات التي يكون حجم الحمولة فيها مهمًا؛ قم بالعودة إلى مسافات 2 أو 4 عندما تحتاج إلى مستند قابل للقراءة.

ماذا يحدث للمفاتيح التي لا تعتبر أسماء عناصر XML صالحة؟

لا يمكن أن تحتوي أسماء عناصر XML على مسافات، ولا يمكن أن تبدأ برقم أو واصلة أو فترة، وتستبعد معظم علامات الترقيم. يتم تطهير المفاتيح التي تنتهك هذه القواعد - تصبح الأحرف غير الصالحة شرطات سفلية وتتم إضافة شرطة سفلية بادئة عند الحاجة - لذلك يتم تحليل الإخراج دائمًا، حتى لو لم تكن مفاتيح JSON الخاصة بك صديقة لـ XML.

هل JSON إلى XML ذهابًا وإيابًا باستخدام أداة XML إلى JSON؟

بالنسبة للهياكل المشتركة، فإنه يفعل ذلك. تشترك هذه الأداة وأداة XML إلى JSON في نفس &quot؛@&quot؛ بادئة السمة و&quot؛#text&quot؛ مفتاح المحتوى، لذا فإن تحويل XML إلى JSON والعودة بشكل عام يعيد إنتاج نفس المستند. تعد التفاصيل المستقلة عن الطلب والمحتوى المختلط هي المصادر المعتادة للاختلافات الصغيرة، كما هو الحال مع أي تعيين XML/JSON.

هل من الآمن تحويل JSON الحساسة هنا؟

نعم. المحول عبارة عن JavaScript عادي يعمل بالكامل في متصفحك - لا يتم نقل أي شيء تقوم بلصقه إلى الخادم أو تسجيله أو تخزينه. وهذا يجعله آمنًا لاستجابات واجهة برمجة التطبيقات وملفات التكوين والسجلات التي تحتوي على رموز مميزة أو بيانات شخصية، ويستمر في العمل دون أي اتصال بالشبكة.


Comments

0 comments

0/2000 characters

No comments yet. Be the first to share your thoughts!