يعد XML تنسيقًا شائعًا ومرنًا للغاية في الوقت الحاضر. يجب أن يفهمها كل مبرمج، فهي ببساطة أمر لا بد منه. ترتبط العديد من التقنيات اليوم، وتستخدمها بنشاط، ومن بينها التقنيات الحديثة.
أساسيات XML لمبرمج Java - الجزء 1 من 3 - 1

مقدمة

مرحبا عزيزي القراء لمقالتي. أريد أن أقول على الفور أن هذه ليست سوى المقالة الأولى في سلسلتي المكونة من ثلاث مقالات. الهدف الرئيسي للسلسلة بأكملها هو تعريف كل قارئ بـ XML وتقديم، إن لم يكن شرحًا وفهمًا كاملين، فعلى الأقل دفعة جيدة نحو ذلك، موضحًا النقاط والأشياء الرئيسية. ستكون الدورة بأكملها لترشيح واحد - "الاهتمام بالتفاصيل" ، ويتم التقسيم إلى 3 مقالات لتتناسب مع عدد الأحرف المسموح به في المشاركات وتقسيم كمية كبيرة من المواد إلى أجزاء أصغر لفهم أكبر. سيتم تخصيص المقالة الأولى لـ XML نفسها وما هي عليه، بالإضافة إلى إحدى طرق إنشاء مخطط لملفات XML - DTD. في البداية، أود أن أقدم مقدمة صغيرة لأولئك الذين لم يعرفوا بعد لغة XML: لا داعي للخوف. XML ليس معقدًا جدًا ويجب أن يفهمه أي مبرمج، لأنه تنسيق ملف مرن وفعال وشائع للغاية اليوم لتخزين مجموعة متنوعة من المعلومات التي تريدها. يتم استخدام XML في Ant وMaven وSpring. أي مبرمج يحتاج إلى معرفة XML. الآن بعد أن اكتسبت القوة والحافز، فلنبدأ الدراسة. سأحاول وضع جميع المواد ببساطة قدر الإمكان، وجمع فقط أهمها وعدم الخوض في الأعشاب الضارة.

XML

للحصول على شرح أكثر وضوحًا، سيكون من الأفضل تصور ملف XML بمثال.
<?xml version="1.0" encoding="UTF-8"?>
<company>
    <name>IT-Heaven</name>
    <offices>
        <office floor="1" room="1">
            <employees>
                <employee>
                    <name>Maksim</name>
                    <job>Middle Software Developer</job>
                </employee>
                <employee>
                    <name>Ivan</name>
                    <job>Junior Software Developer</job>
                </employee>
                <employee>
                    <name>Franklin</name>
                    <job>Junior Software Developer</job>
                </employee>
            </employees>
        </office>
        <office floor="1" room="2">
            <employees>
                <employee>
                    <name>Herald</name>
                    <job>Middle Software Developer</job>
                </employee>
                <employee>
                    <name>Adam</name>
                    <job>Middle Software Developer</job>
                </employee>
                <employee>
                    <name>Leroy</name>
                    <job>Junior Software Developer</job>
                </employee>
            </employees>
        </office>
    </offices>
</company>
HTML وXML متشابهان في بناء الجملة لأن لديهما أصل مشترك - SGML. ومع ذلك، في HTML لا يوجد سوى علامات ثابتة لمعيار معين، بينما في XML يمكنك إنشاء علاماتك وسماتك الخاصة، وبشكل عام، القيام بكل ما تريد لتخزين البيانات بالطريقة التي تناسبك. في الواقع، يمكن لأي شخص يعرف اللغة الإنجليزية قراءة ملفات XML. يمكن تصوير هذا المثال باستخدام شجرة. أساسيات XML لمبرمج Java - الجزء 1 من 3 - 2جذر الشجرة هو الشركة. وهو أيضًا العنصر الجذري (الجذر) الذي تأتي منه جميع العناصر الأخرى. يمكن أن يحتوي كل ملف XML على عنصر جذر واحد فقط. ويجب أن يتم الإعلان عنه بعد الإعلان عن ملف xml (السطر الأول في المثال) وأن يحتوي على جميع العناصر الأخرى. القليل عن الإعلان: إنه إلزامي وضروري لتعريف المستند على أنه XML. يحتوي على ثلاث سمات زائفة (سمات خاصة محددة مسبقًا): الإصدار (وفقًا لمعيار 1.0)، والتشفير (الترميز)، والمستقل (الاستقلالية: إذا كانت نعم ومخططات خارجية متصلة بالمستند، فسيكون هناك خطأ، الافتراضي لا يوجد). العناصر هي كيانات تقوم بتخزين البيانات باستخدام عناصر وسمات أخرى. السمات هي معلومات إضافية حول عنصر يتم تحديده عند إضافة عنصر. إذا ترجمنا الشرح إلى حقل OOP يمكننا إعطاء المثال التالي: لدينا سيارة، كل سيارة لها خصائص (لون، سعة، ماركة، إلخ) - هذه سمات، وهناك كيانات موجودة داخل السيارة : الأبواب، النوافذ، المحرك، عجلة القيادة هي عناصر أخرى. يمكنك تخزين الخصائص إما كعناصر فردية أو كسمات، حسب رغبتك. بعد كل شيء، يعد XML تنسيقًا مرنًا للغاية لتخزين المعلومات حول أي شيء. بعد الشرح، نحتاج فقط إلى إلقاء نظرة على المثال أعلاه حتى يصبح كل شيء في مكانه الصحيح. في المثال، وصفنا هيكلًا بسيطًا للشركة: هناك شركة لها اسم ومكاتب، وفي المكاتب يوجد موظفون. تعد عناصر الموظفين والمكاتب عناصر مجمعة - فهي تعمل على جمع عناصر من نفس النوع، ودمجها بشكل أساسي في مجموعة واحدة لسهولة المعالجة. تستحق الأرضية والغرفة اهتمامًا خاصًا. وهذه هي صفات المكتب (الطابق والرقم)، أي خصائصه. إذا كان لدينا عنصر "صورة"، فيمكننا نقل أبعاده. قد تلاحظ أن الشركة ليس لديها سمة اسم، ولكن لديها عنصر اسم. يمكنك ببساطة وصف الهياكل بالطريقة التي تريدها. لا أحد يجبرك على كتابة جميع خصائص العناصر في السمات فقط، يمكنك استخدام العناصر فقط وكتابة بعض البيانات بداخلها. على سبيل المثال، يمكننا تسجيل اسم ومنصب موظفينا كصفات:
<?xml version="1.0" encoding="UTF-8"?>
<company>
    <name>IT-Heaven</name>
    <offices>
        <office floor="1" room="1">
            <employees>
                <employee name="Maksim" job="Middle Software Developer">

                </employee>
                <employee name="Ivan" job="Junior Software Developer">

                </employee>
                <employee name="Franklin" job="Junior Software Developer">

                </employee>
            </employees>
        </office>
        <office floor="1" room="2">
            <employees>
                <employee name="Herald" job="Middle Software Developer">

                </employee>
                <employee name="Adam" job="Middle Software Developer">

                </employee>
                <employee name="Leroy" job="Junior Software Developer">

                </employee>
            </employees>
        </office>
    </offices>
</company>
كما ترون، الآن اسم ومنصب كل موظف هو سماته. ويمكنك ملاحظة أنه لا يوجد شيء داخل الكيان الموظف (العلامة)، وجميع عناصر الموظف فارغة. ثم يمكنك جعل الموظف عنصرًا فارغًا - أغلقه فورًا بعد الإعلان عن السمات. ويتم ذلك بكل بساطة، فقط أضف شرطة مائلة:
<?xml version="1.0" encoding="UTF-8"?>
<company>
    <name>IT-Heaven</name>
    <offices>
        <office floor="1" room="1">
            <employees>
                <employee name="Maksim" job="Middle Software Developer" />
                <employee name="Ivan" job="Junior Software Developer" />
                <employee name="Franklin" job="Junior Software Developer" />
            </employees>
        </office>
        <office floor="1" room="2">
            <employees>
                <employee name="Herald" job="Middle Software Developer" />
                <employee name="Adam" job="Middle Software Developer" />
                <employee name="Leroy" job="Junior Software Developer" />
            </employees>
        </office>
    </offices>
</company>
كما ترون، من خلال إغلاق العناصر الفارغة، حافظنا على سلامة المعلومات بالكامل واختصرنا السجل بشكل كبير، مما جعل المعلومات أكثر إيجازًا وسهولة في القراءة. لإضافة تعليق (النص الذي سيتم تخطيه عند تحليل ملف) في XML، هناك بناء الجملة التالي:
<!-- Ivan недавно уволился, только неделю отработать должен. Не забудьте потом удалить его из списка.-->
والبناء الأخير هو CDATA ، وهو ما يعني "بيانات الشخصية". بفضل هذا التصميم، من الممكن كتابة نص لن يتم تفسيره على أنه علامة XML. يعد هذا مفيدًا إذا كان لديك كيان داخل ملف XML يقوم بتخزين علامة XML في المعلومات. مثال:
<?xml version="1.0" encoding="UTF-8" ?>
<bean>
    <information>
        <![CDATA[<name>Ivan</name><age>26</age>]]>
    </information>
</bean>
إن الشيء المتعلق بـ XML هو أنه يمكنك توسيعه كما تريد: استخدم عناصرك الخاصة، وسماتك الخاصة، وقم ببنائها كما يحلو لك. يمكنك استخدام كل من السمات والعناصر لتخزين البيانات (كما هو موضح في المثال سابقًا). ومع ذلك، عليك أن تفهم أنه يمكنك التوصل إلى العناصر والسمات الخاصة بك بسرعة وكيفما تريد، ولكن ماذا لو كنت تعمل في مشروع حيث يريد مبرمج آخر نقل عنصر الاسم إلى السمات، ومنطق البرنامج بأكمله هو مكتوب بحيث كان هذا الاسم عنصرا؟ كيف يمكنك إنشاء قواعدك الخاصة حول العناصر التي يجب أن تكون، والسمات التي تمتلكها، وأشياء أخرى، حتى تتمكن من التحقق من صحة ملفات XML والتأكد من أن القواعد ستصبح قياسية في مشروعك ولن ينتهكها أحد؟ من أجل كتابة جميع قواعد ترميز XML الخاص بك، هناك أدوات خاصة. أشهرها: مخطط DTD وXML. هذه المقالة سوف تتحدث فقط عن الأول.

دتد

يتم إنشاء DTD لوصف أنواع المستندات. لقد أصبح DTD قديمًا بالفعل ويتم التخلي عنه الآن بشكل نشط في XML، ولكن لا يزال هناك العديد من ملفات XML التي تستخدم DTD، وبشكل عام، من المفيد فهمها. DTD هي تقنية للتحقق من صحة مستندات XML . يعلن DTD عن قواعد محددة لنوع المستند: عناصره، والعناصر التي يمكن أن تكون داخل العنصر، والسمات، سواء كانت مطلوبة أم لا، وعدد تكراراتها، وكذلك الكيانات. كما هو الحال مع XML، يمكن تصور DTD بمثال للحصول على شرح أكثر وضوحًا.
<!-- Объявление возможных элементов -->
<!ELEMENT employee EMPTY>
<!ELEMENT employees (employee+)>
<!ELEMENT office (employees)>
<!ELEMENT offices (office+)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT company (name, offices)>

<!-- Добавление атрибутов для элементов employee и office -->
<!ATTLIST employee
        name CDATA #REQUIRED
        job  CDATA #REQUIRED
>

<!ATTLIST office
        floor CDATA #REQUIRED
        room  CDATA #REQUIRED
>

<!-- Добавление сущностей -->
<!ENTITY M "Maksim">
<!ENTITY I "Ivan">
<!ENTITY F "Franklin">
هنا لدينا مثل هذا المثال البسيط. في هذا المثال، أعلنا عن التسلسل الهرمي بأكمله من مثال XML: الموظف، الموظفون، المكتب، المكاتب، الاسم، الشركة. لإنشاء ملفات DTD، هناك 3 تركيبات رئيسية تستخدم لوصف أي ملفات XML: ELEMENT (لوصف العناصر)، ATTLIST (لوصف سمات العناصر) وENTITY (لاستبدال النص بنماذج مختصرة). ELEMENT يستخدم لوصف عنصر. يتم إدراج العناصر التي يمكن استخدامها ضمن العنصر الموصوف بين قوسين في نموذج القائمة. يمكنك استخدام محددات الكمية للإشارة إلى الكمية (وهي تشبه محددات الكمية من التعبيرات العادية): +يعني 1+ *يعني 0+ ?يعني 0أو 1 إذا لم تتم إضافة محددات كمية، فمن المفترض أنه يجب أن يكون هناك عنصر واحد فقط. وإذا أردنا عنصراً من مجموعة عناصر فيمكننا كتابته على النحو التالي:
<!ELEMENT company ((name | offices))>
ثم يتم اختيار أحد العناصر: الاسم أو المكاتب، ولكن إذا كان هناك اثنان منهم داخل الشركة، فلن تتم عملية التحقق. يمكنك أيضًا ملاحظة وجود كلمة EMPTY في الموظف - وهذا يعني أن العنصر يجب أن يكون فارغًا. هناك أيضًا أي - أي عناصر. #PCDATA - البيانات النصية. ATTLIST يستخدم لإضافة سمات إلى العناصر. بعد ATTLIST يتبع اسم العنصر المطلوب، وبعده قاموس على شكل "اسم السمة - نوع السمة"، وفي النهاية يمكنك إضافة #IMPLIED (اختياري) أو #REQUIRED (مطلوب). CDATA - البيانات النصية. هناك أنواع أخرى، لكنها كلها صغيرة. يتم استخدام ENTITY ENTITY لإعلان الاختصارات والنص الذي سيتم وضعها عليها. في الواقع، سنكون قادرين ببساطة على استخدام اسم الكيان مع علامة & قبل و، بدلاً من النص الكامل، فقط. بعد. على سبيل المثال: للتمييز بين علامات HTML والأحرف فقط، غالبًا ما يتم تخطي القوس الأيسر باستخدام lt; ، ما عليك سوى وضع & قبل lt. ثم لن نستخدم العلامات، بل ببساطة الرمز <. كما ترون، كل شيء بسيط للغاية: أنت تعلن عن العناصر، وتشرح العناصر التي يمكن للعناصر المعلنة أن تحتوي عليها، وتضيف سمات إلى هذه العناصر، ويمكنك، إذا رغبت في ذلك، إضافة كيانات لتقصير بعض الإدخالات. وهنا عليك أن تسأل: كيف نستخدم قواعدنا في ملف XML الخاص بنا؟ بعد كل شيء، لقد أعلنا القواعد ببساطة، لكننا لم نستخدمها في XML. هناك طريقتان لاستخدامها في XML: 1. التضمين - كتابة قواعد DTD داخل ملف XML نفسه، ما عليك سوى كتابة العنصر الجذر بعد الكلمة الأساسية DOCTYPE وإحاطة ملف DTD الخاص بنا بين قوسين مربعين.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE company [
        <!-- Объявление возможных элементов -->
        <!ELEMENT employee EMPTY>
        <!ELEMENT employees (employee+)>
        <!ELEMENT office (employees)>
        <!ELEMENT offices (office+)>
        <!ELEMENT name (#PCDATA)>
        <!ELEMENT company (name, offices)>

        <!-- Добавление атрибутов для элементов employee и office -->
        <!ATTLIST employee
        name CDATA #REQUIRED
        job  CDATA #REQUIRED
        >

        <!ATTLIST office
        floor CDATA #REQUIRED
        room  CDATA #REQUIRED
        >

        <!-- Добавление сущностей -->
        <!ENTITY M "Maksim">
        <!ENTITY I "Ivan">
        <!ENTITY F "Franklin">
]>

<company>
    <name>IT-Heaven</name>
    <!-- Ivan недавно уволился, только неделю отработать должен. Не забудьте потом удалить его из списка.-->
    <offices>
        <office floor="1" room="1">
            <employees>
                <employee name="&M;" job="Middle Software Developer" />
                <employee name="&I;" job="Junior Software Developer" />
                <employee name="&F;" job="Junior Software Developer" />
            </employees>
        </office>
        <office floor="1" room="2">
            <employees>
                <employee name="Herald" job="Middle Software Developer" />
                <employee name="Adam" job="Middle Software Developer" />
                <employee name="Leroy" job="Junior Software Developer" />
            </employees>
        </office>
    </offices>
</company>
2. الاستيراد - نكتب جميع قواعدنا في ملف DTD منفصل، وبعد ذلك في ملف XML نستخدم بنية DOCTYPE من الطريقة الأولى، فقط بدلاً من الأقواس المربعة تحتاج إلى كتابة SYSTEM وتحديد مسار مطلق أو نسبي إلى الموقع الحالي للملف.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE company SYSTEM "dtd_example1.dtd">

<company>
    <name>IT-Heaven</name>
    <!-- Ivan недавно уволился, только неделю отработать должен. Не забудьте потом удалить его из списка.-->
    <offices>
        <office floor="1" room="1">
            <employees>
                <employee name="&M;" job="Middle Software Developer" />
                <employee name="&I;" job="Junior Software Developer" />
                <employee name="&F;" job="Junior Software Developer" />
            </employees>
        </office>
        <office floor="1" room="2">
            <employees>
                <employee name="Herald" job="Middle Software Developer" />
                <employee name="Adam" job="Middle Software Developer" />
                <employee name="Leroy" job="Junior Software Developer" />
            </employees>
        </office>
    </offices>
</company>
يمكنك أيضًا استخدام الكلمة الأساسية PUBLIC بدلاً من SYSTEM، ولكن من غير المرجح أن تكون مفيدة لك. إذا كنت مهتمًا، يمكنك أن تقرأ عنه (وحول النظام أيضًا) بالتفصيل هنا: الرابط . الآن لا يمكننا استخدام عناصر أخرى دون الإعلان عنها في DTD، وكل XML يخضع لقواعدنا. يمكنك محاولة كتابة هذا الرمز في IntelliJ IDEA في ملف منفصل بامتداد .xml ومحاولة إضافة بعض العناصر الجديدة أو إزالة عنصر من DTD الخاص بنا ولاحظ كيف سيشير IDE إليك إلى خطأ. ومع ذلك، فإن DTD له عيوبه:
  • لديه بناء جملة خاص به، يختلف عن بناء جملة XML.
  • لا يحتوي DTD على فحص لنوع البيانات ويمكن أن يحتوي فقط على سلاسل.
  • لا توجد مساحة اسم في DTD.
حول مشكلة بناء الجملة الخاصة بك: يجب أن تفهم بناء جملتين في وقت واحد: بناء جملة XML وDTD. إنهم مختلفون وهذا قد يجعلك في حيرة من أمرك. ولهذا السبب أيضًا، يكون من الصعب تتبع الأخطاء في ملفات XML الضخمة بالتزامن مع نفس مخططات DTD. إذا لم ينجح شيء ما بالنسبة لك، فيجب عليك التحقق من كمية كبيرة من النص باستخدام صيغ مختلفة. إنه مثل قراءة كتابين في نفس الوقت: باللغتين الروسية والإنجليزية. وإذا كانت معرفتك بلغة واحدة أسوأ، فسيكون فهم النص صعبا أيضا. حول مشكلة التحقق من نوع البيانات: تحتوي السمات الموجودة في DTDs على أنواع مختلفة، ولكنها جميعًا، في جوهرها، عبارة عن تمثيلات سلسلة لشيء ما أو قوائم أو روابط. ومع ذلك، لا يمكنك طلب أرقام فقط، وخاصة الأرقام الإيجابية أو السلبية. ويمكنك نسيان أنواع الكائنات تمامًا. سيتم مناقشة المشكلة الأخيرة في المقالة التالية، والتي سيتم تخصيصها لمساحات الأسماء ومخططات XML، حيث أن مناقشتها هنا لا معنى لها. شكرًا لكم جميعًا على اهتمامكم، لقد قمت بالكثير من العمل وما زلت أفعله لإنهاء سلسلة المقالات بأكملها في الوقت المحدد. في الأساس، كل ما علي فعله هو اكتشاف مخططات XML والتوصل إلى شرح لها بكلمات أكثر وضوحًا لإنهاء المقالة الثانية. تم الانتهاء من نصفها بالفعل، لذا يمكنك توقع ذلك قريبًا. سيتم تخصيص المقالة الأخيرة بالكامل للعمل مع ملفات XML باستخدام Java. بالتوفيق للجميع والنجاح في البرمجة :) المقال التالي: [مسابقة] أساسيات XML لمبرمج Java - الجزء 2 من 3