أدوات المستخدم

أدوات الموقع


docs:xml_basics

اختلافات

عرض الاختلافات بين النسخة المختارة و النسخة الحالية من الصفحة.

رابط إلى هذه المقارنة

جانبي المراجعة السابقة المراجعة السابقة
المراجعة التالية
المراجعة السابقة
docs:xml_basics [2010/05/30 19:40]
alsadi
docs:xml_basics [2015/04/23 00:20] (حالي)
سطر 1: سطر 1:
 +{{tag>​مقالات بدهيات برمجة ويب xml}}
 +====== بدهيات XML ======
 +هذه الوثيقة لم تكتمل بعد
  
 +===== مقدمة =====
 +
 +===== الأدوات =====
 +
 +===== الصياغة =====
 +يتم صياغة مستندات xml في أبسط صورها هكذا
 +<code xml>
 +<?xml version="​1.0"​ encoding="​utf-8"?>​
 +<​myRoot>​
 +  <​myElement>​
 +    <​someChild>​Data goes here</​someChild>​
 +  </​myElement>​
 +</​myRoot>​
 +</​code>​
 +حيث نعرف عن نوع المستند وعن الترميز المتبع فيه (في مثالنا utf8) بواسطة السطر الأول
 +<code xml>
 +<?xml version="​1.0"​ encoding="​utf-8"?>​
 +</​code>​
 +
 +ثم بعد ذلك يأتي العنصر الجذر وهو الجد الأكبر لكل عقد شجرة xml في ملفات xhtml يمكن أن يكون اسم هذا العنصر html هكذا
 +<code xml>
 +<?xml version="​1.0"​ encoding="​utf-8"?>​
 +<​html>​
 +</​html>​
 +</​code>​
 +
 +ثم تتوالى أحفاده من العناصر بنفس الطريقة حيث يبدأ العنصر أو الوسم بكتابة اسمه بين حاصرتين زاويتين (علامتي أكبر وأصغر) وتنتهي بوضع علامة / قبل اسم العنصر.
 +
 +العناصر التي لا محتويات لها يمكن إغلاقها فورا هكذا
 +<code xml>
 +<br/>
 +</​code>​
 +
 +==== أنواع العقد nodes ====
 +  * العناصر elements وهي الاسم بعد بداية القوس الزاوي
 +  * الصفات attributes وهي بين الاسم وبين إغلاق القوس الزاوي (وهي عبارة عن قيمة ثم علامة = ثم قيمة بين علامتي اقتباس)
 +  * النص الموسوم (إما معرَب PCDATA ​  ​وإما غير معرَب CDATA)
 +  * فضاء التسمية وهو بأن نذكر الفضاء ثم : ثم العنصر
 +  * تعليمات المعالجة وهي التي تكون بين علامتي سؤال داخل القوسين الزاويين كما في php
 +  * عقد التوثيق وهي التي تحتوي علامة ! بعد القوس الزاوي.
 +  * تعليقات ليست جزء من متن الوثيقة حيث يتم تجاهلها
 +
 +==== العلاقات بين العقد ====
 +تتوزع العقد في شجرة كما في شجرة العائلة.
 +
 +  * علاقة parent/​child أي أب/ابن حيث كل عقدة لها أب واحد فقط (إلا الجذر)
 +  * علاقة ​ Ancestors/​Descendants أي جد/​سليل مثلا العقدة الجذر جد لكل العقد. وكل العقد من سلالتها (أحفادها)
 +  * siblings أي الأشقاء وهي العقد التي لها نفس الوالد.
 +
 +==== التخطي escaping ====
 +بما أن الأقواس الزاوية تستخدم في عمل عناصر xml لذا يمكن أن تكون جزء من البيانات (النص المعرَب) بل يجب تخطيها مثلا إن كنت تريد أن تضع كود برنامج به علامة أصغر فإن ما يلي **خطأ**
 +<​code>​
 +<​program>​
 +if (x<y) {printf("​x is less than y");}
 +</​program>​
 +</​code>​
 +والصواب هو:
 +<code xml>
 +<​program>​
 +if (x&​lt;​y) {printf("​x is less than y");}
 +</​program>​
 +</​code>​
 +
 +حيث نستخدم علامة خاصة هي & ثم اسم الكيان في مثالنا lt أي less than ثم فاصلة منقوطة ; 
 +وبنفس الطريقة نتخطى علامة > بالكيان gt أي greater than
 +وبما أن & علامة خاصة تحدد الكيانات لذا يجب تخطيها بواسطة الكيان amp
 +
 +إن كان هناك نص طويل مليء بالكود الذي يحتاج تخطي (مثلا كود javascript) فإن من الأسهل استخدام البيانات غير المعربة CDATA 
 +<code xml>
 +<​![CDATA[data goes here]]>
 +</​code>​
 +
 +هكذا
 +<code xml>
 +<​program>​
 +<​![CDATA[
 +if (x < y && z > y) {
 +  printf("​hello"​);​
 +}
 +
 +]]>
 +</​program>​
 +</​code>​
 +عوضا عن استخدام الكيانات
 +<code xml>
 +<​program>​
 +if (x &lt; y &​amp;&​amp;​ z &gt; y) {
 +  printf("​hello"​);​
 +}
 +</​program>​
 +</​code>​
 +
 +===== الكيانات entities =====
 +==== الكيانات التلقائية ====
 +إضافة إلى lt و gt و amp التي تلزم للتخطي هناك quot و apos
 +^ الكيانات التلقائية في xml ^^
 +^ الكيان ^ القيمة ^
 +| lt | علامة أقل < |
 +| gt | علامة أكبر > |
 +| amp | علامة & |
 +| apos | علامة ' |
 +| quot | علامة الاقتباس " |
 +
 +في لغة html فإن هناك الكثير من الكيانات التي لا تكون معرفة تلقائيا في xml مثل ​
 +nbsp والتي تعني مسافة ومثل infin والتي تعني علامة ∞ للمزيد انظر
 +
 +  * [[http://​htmlhelp.com/​reference/​html40/​entities/​|مرجع بالكيانات في html 4]]
 +
 +==== تعريف كيانات خاصة واستخدامها ====
 +إن كان هناك نص يتكرر بكثرة أو يتغير بكثرة في أكثر من موضع أو غير موجود على لوحة المفاتيح قد ترغب في استخدام الكيانات.
 +
 +يتم تعريف الكيان عبر عقدة وثيقة أي بعد ! وذلك بالشكل التالي
 +<code xml>
 +<!ENTITY entityName "text to be substituted">​
 +</​code>​
 +
 +مثلا عند عمل وثيقة الإصدار 7.2 من برنامج ثم جاءت إصدارة 7.3 الجديدة عوضا عن البحث عن 7.2 وتعديلها نعمل كيان اسمه الإصدار ونعرفه في رأس الوثيقة
 +<code xml>
 +<!ENTITY version "​7.2">​
 +<doc>
 +Welcome to Product &​version;​ documentation
 +you are using Product &​version; ​
 +</​doc>​
 +</​code>​
 +
 +==== استخدام كيانات من ملف خارجي ====
 +يمكنك جلب محتوى الكيان في ملف آخر هكذا
 +<code xml>
 +<!ENTITY entityName SYSTEM "​file.txt">​
 +</​code>​
 +
 +ويمكن الاستفادة من هذه الطريقة في احتواء ملفات خارجية وذلك بتعريف كيانات تشير لها ثم استدعاء الكيان هكذا
 +<code xml>
 +<!ENTITY ch1 SYSTEM "​ch1.xml">​
 +<!ENTITY ch2 SYSTEM "​ch2.xml">​
 +<!ENTITY ch3 SYSTEM "​ch3.xml">​
 +<​book>​
 +&ch1;
 +&ch2;
 +&ch3;
 +</​book>​
 +</​code>​
 +
 +==== فضاءات التسمية namespaces ====
 +
 +أحيانا يمكنك تنضيد أكثر من نوع من أنواع xml في وثيقة واحدة مثلا xhtml و svg و xsl و OpenDocument Formate وغيرها لكن تخيل أن وسم معين له معان مختلفة في تلك الأنواع لذا نستخدم فضاءات التسمية لتجنب حصول تضارب بين تلك الأنواع ويكون ذلك بوضع تعريف فضاء التسمية xmlns على أي عقدة غالبا العقدة الجذر وصيغته تشبه تعيين الصفات حيث تتبع بعلامة المساواة ثم معرف الفضاء الذي مثلا في حالة xhtml هو 
 +http://​www.w3.org/​1999/​xhtml هذا العنوان مجرد معرّف وليس بالضرورة أن يحتوي الموقع المشار له أي شيء.
 +
 +<code xml>
 +<?xml version="​1.0"​ encoding="​utf-8"?>​
 +<html xmlns="​http://​www.w3.org/​1999/​xhtml">​
 +<br>
 +</​html>​
 +</​code>​
 +
 +هذا يعني أن العنصر br هو من فضاء التسمية التلقائي الذي هو xhtml. يمكن حديد أكثر من فضاء تسمية وذلك بذكر : ثم اسم الفضاء ثم = ثم معرف الفضاء. وعند سرد العناصر نضع الفضاء ثم : ثم العنصر
 +<code xml>
 +<?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> ​
 +</​code>​
 +
 +هذا يعني أن الفضاء التلقائي هو xhtml وهناك فضاء svg أيضا. مثلا p هنا تنتمي لفضاء xhtml يعني هي تكافئ ​ xhtml:​p ​ في حين circle جاءت من فضاء svg لأنها محددة صراحة.
 +
 +**ملاحظة:​** المثال أعلاه لا يعمل في المتصفحات وهو مجرد توضيح لمفهوم فضاءات التسمية.
 +
 +===== طرق التحقق validation =====
 +
 +==== سلامة البنية well-formed ====
 +
 +==== تعريف نوع الوثيقة DTD  ====
 +يتم تعريف نوع الوثيقة DTD أي Document Type Definition ​
 +من خلال فرض المزيد من الشروط على عقد xml بحيث نحدد ترتيب العقد وصفاتها مثلا
 +<​code>​
 +<​!ELEMENT book (title, author, publisher?​)>​
 +<​!ATTLIST author ​
 +   ​id ​    ​ID ​      #​IMPLIED
 +   ​death_year ​   CDATA    #REQUIRED
 +   ​dead ​ (yes|no) "​no"​
 +>
 +</​code>​
 +تعني أن عنصر الكتاب book يجب أن يحتوي على عنصر للعنوان ثم عنصر آخر للمؤلف ثم قد يأتي ناشر وقد لا يأتي. والصفات التي يجوز أن يأخذها المؤلف هي المعرّف (ضمني) وعام الوفاة (إلزامي) وهل هو متوفى أم لا (إما yes أو no والتلقائي هو yes).
 +
 +يتم التحقق من مطابقة وثيقة ما لمخطط التعريف عبر xmllint هكذا
 +
 +<code bash>
 +xmllint --noout --dtdvalid file:///​path/​to/​schema.dtd doc.xml
 +</​code>​
 +
 +  * [[http://​www.w3schools.com/​dtd/​default.asp|DTD في w3schools]]
 +  * [[http://​books.google.com/​books?​id=_NqW2BjQtFIC&​pg=PA43&​lpg=PA43&​dq=DTD+Markup-Declarations&​source=bl&​ots=_3P2DUCXGL&​sig=K_Slr8Xj3Mpb_V3zBMPR92tSYOM&​hl=de&​sa=X&​oi=book_result&​resnum=4&​ct=result#​PPA44,​M1|فصل DTD في كتاب تعلم xml في 10 دقائق]]
 +
 +==== الجيل الجديد RelaxNG ​ ====
 +وهي المخطط الجديد لتعريف هيئة xml خاصة وتعني REgular LAnguage for XML Next Generation وتختصر Relax NG أو RNG.
 +
 +يتم التحقق من مطابقة وثيقة ما لمخطط التعريف المطلوب عبر xmllint هكذا
 +<code bash>
 +xmllint --noout --relaxng schema.rng doc.xml
 +</​code>​
 +حيث schema.rng هو التعريف و doc.xml هي الوثيقة المطلوب فحصها.
 +
 +  * [[http://​relaxng.org/​|الموقع الرسمي لمخطط relaxng]]
 +  * [[http://​www.oasis-open.org/​committees/​relax-ng/​spec.html|محددات معايير relaxng]]
 +  * [[http://​relaxng.org/​tutorial-20011203.html|الوثيقة التعليمية]]
 +
 +<​note>​
 +يمكنك مقارنة DTD و RNG من خلال مقارنة ملفين يصفان نفس هيئة xml مثلا ملفي
 +[[http://​git.fedorahosted.org/​git/?​p=comps.git;​a=blob_plain;​f=comps.dtd;​hb=HEAD|comps.dtd]] و
 +[[http://​git.fedorahosted.org/​git/?​p=comps.git;​a=blob_plain;​f=comps.rng;​hb=HEAD|comps.rng]]
 +اللذان يصفان ملفات comps.xml التي تستخدم في توزيعة فيدورا
 +</​note>​
 +
 +==== مزايا rng ====
 +==== ربط وثيقة مع مخطط rng ====
 +==== كتابة rng ====
 +
 +===== معالجة ملفات xml =====
 +==== Xpath ====
 +
 +==== XSLT ====
 +
 +  * [[http://​oreilly.com/​catalog/​9780596003272/​preview#​preview|نسخة معاينة من كتاب Learning XSLT]]
 +
 +===== طرق الإعراب في اللغات المختلفة =====
docs/xml_basics.txt · آخر تعديل: 2015/04/23 00:20 (تحرير خارجي)