JavaRush /مدونة جافا /Random-AR /XML في جافا: ما هو؟

XML في جافا: ما هو؟

نشرت في المجموعة
مرحبًا! اليوم سوف نتعرف على تنسيق بيانات آخر يسمى XML. هذا هو موضوع في غاية الأهمية. عند العمل على تطبيقات Java حقيقية، من المؤكد أنك ستواجه مشكلات متعلقة بـ XML. يتم استخدام هذا التنسيق في كل مكان تقريبًا في تطوير Java (سنكتشف السبب أدناه بالضبط)، لذلك أوصيك بقراءة المحاضرة ليس "قطريًا"، ولكن فهم كل شيء جيدًا وفي نفس الوقت دراسة الأدبيات/الروابط الإضافية :) هذا الوقت لن يضيع بالتأكيد. لذا، لنبدأ بالأشياء البسيطة - "ماذا" و"لماذا"!

ما هو XML؟

يرمز XML إلى لغة التوصيف القابلة للتوسيع. ربما تكون على دراية بإحدى لغات الترميز: لقد سمعت عن HTML، والتي تُستخدم لإنشاء صفحات الويب :) ما هو XML - 1HTML وXML متشابهان في المظهر:
أتش تي أم أل 1
<h1>title</h1>
<p>paragraph</p>
<p>paragraph</p>
أكس أم أل 1
<headline>title</headline>
<paragraph>paragraph</paragraph>
<paragraph>paragraph</paragraph>
أتش تي أم أل 2
<h1>title</h1>
<p>paragraph</p>
<p>paragraph</p>
اكس ام ال 2
<chief>title</chief>
<paragraph>paragraph</paragraph>
<paragraph>paragraph</paragraph>
وبعبارة أخرى، XML هي لغة لوصف البيانات.

لماذا هناك حاجة إلى XML؟

تم اختراع لغة XML في الأصل لتخزين ونقل البيانات بشكل أكثر ملاءمة، بما في ذلك عبر الإنترنت. لديها عدد من المزايا التي تسمح لها بالتعامل بنجاح مع هذه المهمة. أولاً، من السهل قراءتها من قبل كل من البشر وأجهزة الكمبيوتر. أعتقد أنه يمكنك بسهولة فهم ما يصفه ملف xml هذا:
<?xml version="1.0" encoding="UTF-8"?>
<book>
   <title>Harry Potter and the Philosopher’s Stone</title>
   <author>J. K. Rowling</author>
   <year>1997</year>
</book>
كما يفهم الكمبيوتر هذا التنسيق بسهولة. ثانيًا، نظرًا لأنه يتم تخزين البيانات بتنسيق نصي بسيط، فلن تكون هناك مشكلات في التوافق عند نقلها من كمبيوتر إلى آخر. من المهم أن نفهم أن لغة XML ليست تعليمات برمجية قابلة للتنفيذ، ولكنها لغة وصف البيانات . بعد وصف البيانات باستخدام XML، تحتاج إلى كتابة تعليمات برمجية (على سبيل المثال، في Java) يمكنها إرسال/استقبال/معالجة هذه البيانات.

كيف يعمل XML؟

المكون الرئيسي لها هو العلامات: هذه هي الأشياء الموجودة بين قوسين زاوية:
<book>
</book>
هناك علامات فتح وإغلاق. يحتوي الإغلاق على رمز إضافي - " /"، ويمكن رؤية ذلك في المثال أعلاه. يجب أن يكون لكل علامة افتتاحية علامة إغلاق مقابلة. وهي تظهر أين يبدأ وينتهي وصف كل عنصر في الملف. يمكن أن تكون متداخلة العلامات! في مثال كتابنا، تحتوي العلامة <book> على 3 علامات فرعية - <title> و <author> و <year> . لا يقتصر هذا على مستوى واحد: يمكن أن يكون للعلامات الفرعية علامات فرعية خاصة بها، وما إلى ذلك. ويسمى هذا التصميم بشجرة العلامات. دعونا نلقي نظرة على الشجرة باستخدام مثال ملف XML مع وصف لبيع السيارات:
<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">20000.00</price>
   </car>
   <car category="sport">
       <title lang="en">Ferrari 360 Spider</title>
       <year>2018</year>
       <price currency="US dollar">150000.00</price>
   </car>
</carstore>
لدينا هنا علامة المستوى الأعلى - <carstore> . ويسمى أيضًا "الجذر" - علامة الجذر. يحتوي <carstore> على علامة فرعية واحدة، <car>. <car>، بدوره، لديه أيضًا 3 علامات فرعية خاصة به - <model>، و<year>، و<price>. يمكن أن تحتوي كل علامة على سمات - معلومات مهمة إضافية. في مثالنا، تحتوي العلامة <model> على السمة "lang" - اللغة التي يُكتب بها اسم النموذج:
<model lang="en">Scania R 770</model>
بهذه الطريقة يمكننا الإشارة إلى أن العنوان مكتوب باللغة الإنجليزية. تحتوي علامة <price> الخاصة بنا على سمة "العملة".
<price currency="US dollar">150000.00</price>
بهذه الطريقة يمكننا الإشارة إلى أن سعر السيارة بالدولار الأمريكي. وبالتالي، يحتوي XML على بناء جملة "يوصف نفسه ذاتيًا" . يمكنك إضافة أي معلومات تحتاجها لوصف البيانات. يمكنك أيضًا إضافة سطر في بداية الملف يشير إلى إصدار XML والترميز الذي كتبت به البيانات. يطلق عليه " prolog " ويبدو كما يلي:
<?xml version="1.0" encoding="UTF-8"?>
نحن نستخدم XML الإصدار 1.0 وترميز UTF-8. هذا ليس ضروريًا، ولكنه قد يكون مفيدًا، على سبيل المثال، إذا كنت تستخدم نصًا بلغات مختلفة في ملفك. لقد ذكرنا أن XML تعني "لغة الترميز القابلة للتوسيع"، ولكن ماذا تعني كلمة "قابلة للتوسيع"؟ هذا يعني أنه مناسب تمامًا لإنشاء إصدارات جديدة من الكائنات والملفات الخاصة بك. على سبيل المثال، نريد أن يبدأ معرض السيارات الخاص بنا في بيع الدراجات النارية أيضًا! وفي الوقت نفسه، نحتاج في البرنامج إلى دعم كلا الإصدارين من <carstore> - الإصدار القديم (بدون الدراجات النارية) والإصدار الجديد. وهنا نسختنا القديمة:
<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">20000.00</price>
   </car>
   <car category="sport">
       <title lang="en">Ferrari 360 Spider</title>
       <year>2018</year>
       <price currency="US dollar">150000.00</price>
   </car>
</carstore>
وها هو الجديد الموسع:
<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">20000.00</price>
   </car>
   <car category="sport">
       <title lang="en">Ferrari 360 Spider</title>
       <year>2018</year>
       <price currency="US dollar">150000.00</price>
   </car>
   <motorcycle>
       <title lang="en">Yamaha YZF-R6</title>
       <year>2018</year>
       <price currency="Russian Ruble">1000000.00</price>
       <owner>Vasia</owner>
   </motorcycle>
   <motorcycle>
       <title lang="en">Harley Davidson Sportster 1200</title>
       <year>2011</year>
       <price currency="Euro">15000.00</price>
       <owner>Petia</owner>
   </motorcycle>
</carstore>
لقد أضفنا وصف الدراجات النارية إلى ملفنا بكل سهولة وبساطة :) وفي الوقت نفسه، لا نحتاج مطلقًا إلى تعيين نفس العلامات الفرعية للدراجات النارية مثل السيارات. يرجى ملاحظة أن الدراجات النارية، على عكس السيارات، لديها عنصر <مالك> - المالك. لن يمنع هذا الكمبيوتر (أو أي شخص أيضًا) من قراءة البيانات.

الاختلافات بين XML وHTML

لقد قلنا بالفعل أن XML وHTML متشابهان جدًا في المظهر. ولذلك، فمن المهم جدا أن نعرف كيف تختلف. أولا، يتم استخدامها لأغراض مختلفة. HTML - لترميز صفحات الويب. على سبيل المثال، إذا كنت بحاجة إلى إنشاء موقع ويب، باستخدام HTML، يمكنك تحديد: "يجب أن تكون القائمة في الزاوية اليمنى العليا. يجب أن يكون بها أزرار كذا وكذا." بمعنى آخر، الغرض من HTML هو عرض البيانات. XML - لتخزين المعلومات ونقلها بشكل مناسب للإنسان وأجهزة الكمبيوتر. لا يحتوي هذا التنسيق على أي تعليمات حول كيفية عرض هذه البيانات: فهو يعتمد على كود البرنامج نفسه. ثانيا، لديهم اختلاف تقني رئيسي. علامات HTML محددة مسبقًا. بمعنى آخر، لإنشاء عنوان (على سبيل المثال، نقش كبير في بداية الصفحة)، يتم استخدام علامات <h1></h1> فقط في HTML (للعناوين الأصغر - <h2></h2>، < h3></h3>). لن تتمكن من إنشاء عناوين بتنسيق HTML باستخدام علامات ذات عناوين مختلفة. لا يستخدم XML علامات محددة مسبقًا. يمكنك إعطاء العلامات أي أسماء تريدها - <header>، <title>، <idontknow2121>.

حل الصراع

يمكن أن تؤدي الحرية التي يوفرها XML أيضًا إلى بعض المشكلات. على سبيل المثال، يمكن استخدام نفس الكيان (على سبيل المثال، سيارة) بواسطة برنامج لأغراض مختلفة. على سبيل المثال، لدينا ملف XML يصف الأجهزة. ومع ذلك، فإن المبرمجين لدينا لم يتفقوا فيما بينهم مقدما. والآن، بالإضافة إلى البيانات من السيارات الحقيقية، يتضمن ملف XML الخاص بنا أيضًا بيانات من نماذج الألعاب! علاوة على ذلك، لديهم نفس الصفات. يتلقى برنامجنا ملف XML التالي. كيف يمكننا التمييز بين السيارة الحقيقية ونموذج اللعبة؟
<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">100.00</price>
   </car>
</carstore>
سوف تساعدنا البادئات ومساحات الأسماء هنا. لفصل سيارات الألعاب عن السيارات الحقيقية في برنامجنا (وبشكل عام، أي أشياء ألعاب عن نماذجها الأولية الحقيقية)، نقدم بادئتين - "حقيقية" و"لعبة".
<real:car category="truck">
   <model lang="en">Scania R 770</model>
   <year>2005</year>
   <price currency="US dollar">200000.00</price>
</real:car>
<toy:car category="sedan">
   <title lang="en">Ford Focus</title>
   <year>2012</year>
   <price currency="US dollar">100.00</price>
</toy:car>
الآن سيتمكن برنامجنا من التمييز بين الكيانات! أي شيء يحتوي على بادئة لعبة سيتم تصنيفه على أنه ألعاب :) ومع ذلك، فإننا لم ننته بعد. لاستخدام البادئات، نحتاج إلى تسجيل كل منها كمساحة اسم. حسنًا، في الواقع، كلمة "التسجيل" هي كلمة قوية :) ما عليك سوى ابتكار اسم فريد لكل واحد منهم. يشبه الأمر الفئات: للفئة اسم قصير ( Cat) واسم كامل مع جميع الحزم ( zoo.animals.Cat) لإنشاء مساحات أسماء فريدة، عادةً ما يتم استخدام URI . في بعض الأحيان يتم استبدال عنوان الإنترنت هنا، حيث يتم وصف وظائف مساحة الاسم هذه والغرض منها بالتفصيل. ولكن هذا لا يجب أن يكون عنوان إنترنت صالحًا. في كثير من الأحيان، تستخدم المشاريع ببساطة سلاسل تشبه URI تساعد في تتبع التسلسل الهرمي لمساحات الأسماء. هنا مثال:
<?xml version="1.0" encoding="UTF-8"?>
<carstore xmlns:real="http://testproject.developersgroup1.companyname/department2/namespaces/real"
         xmlns:toy="http://testproject.developersgroup1.companyname/department2/namespaces/toy">
<real:car category="truck">
   <model lang="en">Scania R 770</model>
   <year>2005</year>
   <price currency="US dollar">200000.00</price>
</real:car>
<toy:car category="sedan">
   <title lang="en">Ford Focus</title>
   <year>2012</year>
   <price currency="US dollar">100.00</price>
</toy:car>
</carstore>
بالطبع لا يوجد موقع على الإنترنت على العنوان http://testproject.developersgroup1.companyname/department2/namespaces/real ولكن هناك معلومات مفيدة: مجموعة المطورين "developersgroup1" من قسم "department2" هي المسؤولة عن الإنشاء مساحة الاسم "الحقيقية". إذا كنت بحاجة إلى إضافة أسماء جديدة، أو مناقشة التعارضات المحتملة معهم، فنحن نعرف إلى أين نتجه. في بعض الأحيان يتم استخدام عنوان إنترنت حقيقي مع وصف لمساحة الاسم هذه كاسم فريد لمساحة الاسم. على سبيل المثال، إذا كانت شركة كبيرة وسيستخدم مشروعها ملايين الأشخاص حول العالم. لكن هذا لا يتم دائمًا: هناك مناقشة حول هذه المشكلة في Stackoverflow . من حيث المبدأ، فإن متطلبات استخدام معرفات URI كأسماء لمساحات الأسماء ليست صارمة: يمكنك فقط استخدام سلاسل عشوائية. سيعمل هذا الخيار أيضًا:
xmlns:real="nvjneasiognipni4435t9i4gpojrmeg"
ولكن هناك عددًا من المزايا لاستخدام عناوين URI. تستطيع ان تقرأ المزيد عن هذا هنا .

معايير XML الأساسية

معايير XML هي مجموعة من الملحقات التي تضيف وظائف إضافية إلى ملفات XML. يحتوي XML على الكثير من المعايير، لكننا سننظر فقط إلى أهمها ونكتشف ما الذي تسمح به AJAX ، أحد أشهر معايير XML، للقيام به. يسمح لك بتغيير محتوى صفحة الويب دون إعادة تحميلها! يبدو جيدا؟ :) يمكنك تجربة هذه التقنية شخصيًا هنا . XSLT - يسمح لك بتحويل نص XML إلى تنسيقات أخرى. على سبيل المثال، باستخدام XSLT، يمكنك تحويل XML إلى HTML! الغرض من لغة XML، كما قلنا من قبل، هو وصف البيانات، وليس عرضها. لكن باستخدام XSLT يمكننا تجاوز هذا القيد! فيما يلي مثال عملي، حيث يمكنك أن ترى بنفسك كيف يعمل :) XML DOM - يسمح لك بالحصول على عناصر فردية أو تغييرها أو إضافتها أو إزالتها من ملف XML. وهنا مثال صغير لكيفية عمله. لدينا ملف books.xml:
<bookstore>
   <book category="cooking">
       <title lang="en">Everyday Italian</title>
       <author>Giada De Laurentiis</author>
       <year>2005</year>
       <price>30.00</price>
   </book>
   <book category="children">
       <title lang="en">Harry Potter</title>
       <author>J K. Rowling</author>
       <year>2005</year>
       <price>29.99</price>
   </book>
</bookstore>
وفيه كتابان. تحتوي الكتب على عنصر مثل العنوان - <title>. وهنا يمكننا استخدام JavaScript للحصول على جميع عناوين الكتب من ملف XML الخاص بنا وإخراج أولها إلى وحدة التحكم:
<!DOCTYPE html>
<html>
<body>

<p id="demo"></p>

<script>
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
  myFunction(this);
  }
};
xhttp.open("GET", "books.xml", true);
xhttp.send();

function myFunction(xml) {
    var xmlDoc = xml.responseXML;
  document.getElementById("demo").innerHTML =
  xmlDoc.getElementsByTagName("title")[0].childNodes[0].nodeValue;
}
</script>

</body>
</html>
مرة أخرى، أوصي برؤية كيفية عمل هذا المثال باستخدام وضع الحماية :) DTD ("تعريف نوع المستند") - يسمح لك بتحديد قائمة العناصر المسموح بها لبعض الكيانات في ملف XML. على سبيل المثال، نحن نعمل على موقع لبيع الكتب، وقد اتفقت جميع فرق التطوير على أنه بالنسبة لعنصر الكتاب، يجب تحديد سمات العنوان والمؤلف والسنة فقط في ملفات XML. ولكن كيف يمكننا أن نحمي أنفسنا من الغفلة؟ سهل جدا!
<?xml version="1.0"?>
<!DOCTYPE book [
       <!ELEMENT book (title,author,year)>
       <!ELEMENT title (#PCDATA)>
       <!ELEMENT author (#PCDATA)>
       <!ELEMENT year (#PCDATA)>
       ]>

<book>
   <title>The Lord of The Rings</title>
   <author>John R.R. Tolkien</author>
   <year>1954</year>
</book>
قمنا هنا بتحديد قائمة بالسمات الصالحة لـ <book>. حاول إضافة عنصر جديد هناك وستحصل على خطأ على الفور!
<book>
   <title>The Lord of The Rings</title>
   <author>John R.R. Tolkien</author>
   <year>1954</year>
   <mainhero>Frodo Baggins</mainhero>
</book>
خطأ! "العنصر الرئيسي غير مسموح به هنا" هناك العديد من معايير XML الأخرى. يمكنك التعرف على كل واحد منهم ومحاولة التعمق في الكود الموجود على موقع WC3 (قسم "معايير XML المهمة"). وبشكل عام، إذا كنت بحاجة إلى معلومات حول XML، فيمكنك العثور على كل شيء تقريبًا هناك :) حسنًا، لقد انتهت محاضرتنا. حان الوقت للعودة إلى المهام! :) أرك لاحقًا!
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION