جدول المحتويات
بدهيات XML
هذه الوثيقة لم تكتمل بعد
مقدمة
الأدوات
الصياغة
يتم صياغة مستندات xml في أبسط صورها هكذا
<?xml version="1.0" encoding="utf-8"?> <myRoot> <myElement> <someChild>Data goes here</someChild> </myElement> </myRoot>
حيث نعرف عن نوع المستند وعن الترميز المتبع فيه (في مثالنا utf8) بواسطة السطر الأول
<?xml version="1.0" encoding="utf-8"?>
ثم بعد ذلك يأتي العنصر الجذر وهو الجد الأكبر لكل عقد شجرة xml في ملفات xhtml يمكن أن يكون اسم هذا العنصر html هكذا
<?xml version="1.0" encoding="utf-8"?> <html> </html>
ثم تتوالى أحفاده من العناصر بنفس الطريقة حيث يبدأ العنصر أو الوسم بكتابة اسمه بين حاصرتين زاويتين (علامتي أكبر وأصغر) وتنتهي بوضع علامة / قبل اسم العنصر.
العناصر التي لا محتويات لها يمكن إغلاقها فورا هكذا
<br/>
أنواع العقد nodes
- العناصر elements وهي الاسم بعد بداية القوس الزاوي
- الصفات attributes وهي بين الاسم وبين إغلاق القوس الزاوي (وهي عبارة عن قيمة ثم علامة = ثم قيمة بين علامتي اقتباس)
- النص الموسوم (إما معرَب PCDATA وإما غير معرَب CDATA)
- فضاء التسمية وهو بأن نذكر الفضاء ثم : ثم العنصر
- تعليمات المعالجة وهي التي تكون بين علامتي سؤال داخل القوسين الزاويين كما في php
- عقد التوثيق وهي التي تحتوي علامة ! بعد القوس الزاوي.
- تعليقات ليست جزء من متن الوثيقة حيث يتم تجاهلها
العلاقات بين العقد
تتوزع العقد في شجرة كما في شجرة العائلة.
- علاقة parent/child أي أب/ابن حيث كل عقدة لها أب واحد فقط (إلا الجذر)
- علاقة Ancestors/Descendants أي جد/سليل مثلا العقدة الجذر جد لكل العقد. وكل العقد من سلالتها (أحفادها)
- siblings أي الأشقاء وهي العقد التي لها نفس الوالد.
التخطي escaping
بما أن الأقواس الزاوية تستخدم في عمل عناصر xml لذا يمكن أن تكون جزء من البيانات (النص المعرَب) بل يجب تخطيها مثلا إن كنت تريد أن تضع كود برنامج به علامة أصغر فإن ما يلي خطأ
<program> if (x<y) {printf("x is less than y");} </program>
والصواب هو:
<program> if (x<y) {printf("x is less than y");} </program>
حيث نستخدم علامة خاصة هي & ثم اسم الكيان في مثالنا lt أي less than ثم فاصلة منقوطة ; وبنفس الطريقة نتخطى علامة > بالكيان gt أي greater than وبما أن & علامة خاصة تحدد الكيانات لذا يجب تخطيها بواسطة الكيان amp
إن كان هناك نص طويل مليء بالكود الذي يحتاج تخطي (مثلا كود javascript) فإن من الأسهل استخدام البيانات غير المعربة CDATA
<![CDATA[data goes here]]>
هكذا
<program> <![CDATA[ if (x < y && z > y) { printf("hello"); } ]]> </program>
عوضا عن استخدام الكيانات
<program> if (x < y && z > y) { printf("hello"); } </program>
الكيانات entities
الكيانات التلقائية
إضافة إلى lt و gt و amp التي تلزم للتخطي هناك quot و apos
الكيانات التلقائية في xml | |
---|---|
الكيان | القيمة |
lt | علامة أقل < |
gt | علامة أكبر > |
amp | علامة & |
apos | علامة ' |
quot | علامة الاقتباس “ |
في لغة html فإن هناك الكثير من الكيانات التي لا تكون معرفة تلقائيا في xml مثل nbsp والتي تعني مسافة ومثل infin والتي تعني علامة ∞ للمزيد انظر
تعريف كيانات خاصة واستخدامها
إن كان هناك نص يتكرر بكثرة أو يتغير بكثرة في أكثر من موضع أو غير موجود على لوحة المفاتيح قد ترغب في استخدام الكيانات.
يتم تعريف الكيان عبر عقدة وثيقة أي بعد ! وذلك بالشكل التالي
<!ENTITY entityName "text to be substituted">
مثلا عند عمل وثيقة الإصدار 7.2 من برنامج ثم جاءت إصدارة 7.3 الجديدة عوضا عن البحث عن 7.2 وتعديلها نعمل كيان اسمه الإصدار ونعرفه في رأس الوثيقة
<!ENTITY version "7.2"> <doc> Welcome to Product &version; documentation you are using Product &version; </doc>
استخدام كيانات من ملف خارجي
يمكنك جلب محتوى الكيان في ملف آخر هكذا
<!ENTITY entityName SYSTEM "file.txt">
ويمكن الاستفادة من هذه الطريقة في احتواء ملفات خارجية وذلك بتعريف كيانات تشير لها ثم استدعاء الكيان هكذا
<!ENTITY ch1 SYSTEM "ch1.xml"> <!ENTITY ch2 SYSTEM "ch2.xml"> <!ENTITY ch3 SYSTEM "ch3.xml"> <book> &ch1; &ch2; &ch3; </book>
فضاءات التسمية namespaces
أحيانا يمكنك تنضيد أكثر من نوع من أنواع xml في وثيقة واحدة مثلا xhtml و svg و xsl و OpenDocument Formate وغيرها لكن تخيل أن وسم معين له معان مختلفة في تلك الأنواع لذا نستخدم فضاءات التسمية لتجنب حصول تضارب بين تلك الأنواع ويكون ذلك بوضع تعريف فضاء التسمية xmlns على أي عقدة غالبا العقدة الجذر وصيغته تشبه تعيين الصفات حيث تتبع بعلامة المساواة ثم معرف الفضاء الذي مثلا في حالة xhtml هو http://www.w3.org/1999/xhtml هذا العنوان مجرد معرّف وليس بالضرورة أن يحتوي الموقع المشار له أي شيء.
<?xml version="1.0" encoding="utf-8"?> <html xmlns="http://www.w3.org/1999/xhtml"> <br> </html>
هذا يعني أن العنصر br هو من فضاء التسمية التلقائي الذي هو xhtml. يمكن حديد أكثر من فضاء تسمية وذلك بذكر : ثم اسم الفضاء ثم = ثم معرف الفضاء. وعند سرد العناصر نضع الفضاء ثم : ثم العنصر
<?xml version="1.0" encoding="utf-8"?> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg"> <body> <p>This is an HTML paragraph</p> <svg:svg width="100" height="100" version="1.1" > <svg:circle cx="50" cy="50" r="40" stroke="black" stroke-width="2" fill="green" /> </svg:svg> </body> </html>
هذا يعني أن الفضاء التلقائي هو xhtml وهناك فضاء svg أيضا. مثلا p هنا تنتمي لفضاء xhtml يعني هي تكافئ xhtml:p في حين circle جاءت من فضاء svg لأنها محددة صراحة.
ملاحظة: المثال أعلاه لا يعمل في المتصفحات وهو مجرد توضيح لمفهوم فضاءات التسمية.
طرق التحقق validation
سلامة البنية well-formed
تعريف نوع الوثيقة DTD
يتم تعريف نوع الوثيقة DTD أي Document Type Definition من خلال فرض المزيد من الشروط على عقد xml بحيث نحدد ترتيب العقد وصفاتها مثلا
<!ELEMENT book (title, author, publisher?)> <!ATTLIST author id ID #IMPLIED death_year CDATA #REQUIRED dead (yes|no) "no" >
تعني أن عنصر الكتاب book يجب أن يحتوي على عنصر للعنوان ثم عنصر آخر للمؤلف ثم قد يأتي ناشر وقد لا يأتي. والصفات التي يجوز أن يأخذها المؤلف هي المعرّف (ضمني) وعام الوفاة (إلزامي) وهل هو متوفى أم لا (إما yes أو no والتلقائي هو yes).
يتم التحقق من مطابقة وثيقة ما لمخطط التعريف عبر xmllint هكذا
xmllint --noout --dtdvalid file:///path/to/schema.dtd doc.xml
الجيل الجديد RelaxNG
وهي المخطط الجديد لتعريف هيئة xml خاصة وتعني REgular LAnguage for XML Next Generation وتختصر Relax NG أو RNG.
يتم التحقق من مطابقة وثيقة ما لمخطط التعريف المطلوب عبر xmllint هكذا
xmllint --noout --relaxng schema.rng doc.xml
حيث schema.rng هو التعريف و doc.xml هي الوثيقة المطلوب فحصها.