أهلاً! سنقدم اليوم تنسيقًا آخر للبيانات يسمى XML. هذا هو موضوع في غاية الأهمية. عند العمل على تطبيقات Java حقيقية، فمن المؤكد أنك ستواجه مهام متعلقة بـ XML. في تطوير Java، يتم استخدام هذا التنسيق عالميًا تقريبًا (سنكتشف السبب أدناه)، لذلك أوصي بعدم مراجعة هذا الدرس بشكل سطحي، بل الحصول على فهم شامل لكل شيء وأيضًا دراسة الأدبيات/الروابط الإضافية :) هذا بالتأكيد لن يكون مضيعة للوقت. لذا، دعونا نبدأ بالأشياء السهلة: "ماذا" و"لماذا"!
ما هو جافا XML؟
يرمز XML إلى لغة التوصيف القابلة للتوسيع. ربما تكون على دراية بلغة الترميز بالفعل — هل سمعت عن HTML، والتي تُستخدم لإنشاء صفحات الويب :)
كما أن HTML و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> على ثلاث علامات متداخلة: <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"?>
نحن نستخدم الإصدار 1.0 من XML وترميز 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>
هذه هي الطريقة السهلة والبسيطة لإضافة وصف للدراجات النارية إلى ملفنا :) والأكثر من ذلك، أننا لا نحتاج مطلقًا إلى أن يكون لدينا نفس العلامات الفرعية للدراجات النارية مثل السيارات. يرجى ملاحظة أن الدراجات النارية، على عكس السيارات، تحتوي على عنصر <owner>. وهذا لا يمنع الكمبيوتر (أو الإنسان) من قراءة البيانات.
الاختلافات بين XML وHTML
لقد قلنا بالفعل أن XML وHTML متشابهان جدًا في المظهر. وهذا يجعل من المهم جدًا معرفة مدى اختلافها. أولا، يتم استخدامها لأغراض مختلفة. HTML مخصص لترميز صفحات الويب. على سبيل المثال، أثناء إنشاء موقع ويب، يمكنك استخدام HTML لتحديد: "يجب أن تكون القائمة في الزاوية اليمنى العليا. ويجب أن تحتوي على أزرار كذا وكذا". بمعنى آخر، وظيفة HTML هي عرض البيانات. XML مخصص لتخزين المعلومات وإرسالها في شكل مناسب للإنسان وأجهزة الكمبيوتر. لا يحتوي هذا التنسيق على أي إشارة إلى كيفية عرض هذه البيانات: يعتمد ذلك على كود البرنامج الذي يقرأها. ثانيا، هناك اختلاف تقني كبير. علامات HTML محددة مسبقًا. بمعنى آخر، يستخدم إنشاء رأس HTML (على سبيل المثال، تسمية توضيحية كبيرة في أعلى الصفحة) علامات <h1></h1> فقط (يتم استخدام <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" ولكن هذه السلسلة تحتوي على معلومات مفيدة: مطورو المجموعة 1 في القسم 2 مسؤولون عن إنشاء مساحة الاسم "الحقيقية" . إذا كنا بحاجة إلى تقديم أسماء جديدة أو مناقشة الصراعات المحتملة، فسنعرف إلى أين نتجه. يستخدم المطورون أحيانًا عنوان ويب وصفيًا حقيقيًا كاسم مساحة اسم فريد. على سبيل المثال، قد يكون هذا هو الحال بالنسبة لشركة كبيرة سيستخدم مشروعها ملايين الأشخاص حول العالم. ولكن من المؤكد أن هذا لا يتم دائمًا: فقد قام
Stack Overflow
بمناقشة هذه المشكلة. بشكل عام، لا توجد متطلبات صارمة لاستخدام معرفات 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 الأخرى. يمكنك التعرف على كل واحد منهم ومحاولة التعمق في الكود. على أية حال، إذا كنت بحاجة إلى معلومات حول XML، يمكنك العثور على كل شيء تقريبًا هناك :) وبهذا ينتهي درسنا. حان الوقت للعودة إلى المهام! :) حتى المرة القادمة!
GO TO FULL VERSION