هذه الوثيقة لم تكتمل بعد
يتم صياغة مستندات 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/>
تتوزع العقد في شجرة كما في شجرة العائلة.
بما أن الأقواس الزاوية تستخدم في عمل عناصر 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>
إضافة إلى 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>
أحيانا يمكنك تنضيد أكثر من نوع من أنواع 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 لأنها محددة صراحة.
ملاحظة: المثال أعلاه لا يعمل في المتصفحات وهو مجرد توضيح لمفهوم فضاءات التسمية.
يتم تعريف نوع الوثيقة 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
وهي المخطط الجديد لتعريف هيئة xml خاصة وتعني REgular LAnguage for XML Next Generation وتختصر Relax NG أو RNG.
يتم التحقق من مطابقة وثيقة ما لمخطط التعريف المطلوب عبر xmllint هكذا
xmllint --noout --relaxng schema.rng doc.xml
حيث schema.rng هو التعريف و doc.xml هي الوثيقة المطلوب فحصها.