RSS

تعلم XPath بالأمثلة

03 مارس

لقد ذاع صيت لغة XML حتى أصبح القاصي والداني في عالم الويب يسمع بها أو حتى يستخدمها وإن كان غير مدرك لهذه الحقيقة في بعض الحالات، وانتشر استخدامها وتوسع بعد أن كانت حكراً على بعض المختصين وفي مقامات قليلة نسبياً لتصبح إحدى أهم وسائل التواصل فيما بين التطبيقات البرمجية عامة وتطبيقات الويب بشكل خاص، لا بل وسيلة للتواصل فيما بين متصفحات المستخدمين من جهة والتطبيقات البرمجية العاملة على طرف المخدم من جهة أخرى (كما هي الحال في تقنية AJAX على سبيل المثال)، لذا أصبح التعامل مع بيانات XML واحداً من المهام الأساسية والمتكررة في أي مشروع قد تشارك به. وقد ساهم في هذا التوسع بساطة تنسيق ملفات XML، فهي في نهاية المطاف مجرد ملفات نصية صرفة بتنسيق عادة ما يفسّر نفسه بنفسه، بحيث يمكن لقارئ من البشر أن يدرك مكنوناتها وتركيبها، لذا أخذت العديد من لغات البرمجة تدعم القراءة من هذا التنسيق والكتابة إليه إضافة إلى توفير الأدوات البرمجية اللازمة والتي تجعل من هذه المهمة غاية في البساطة ومدمجة إلى حد بعيد ضمن لغات البرمجة تلك. لكن على الرغم من قدرتنا على إنشاء وثائق جيدة البنية بهذا التنسيق، إلا أن تنسيق XML يفتقر ظاهريا لوسيلة سهلة تمكنك من إيجاد المعلومات داخل تلك الوثائق.

نتيجة لتفهم W3C الحاجة المتزايدة لاستخدام تنسيق XML، فقد قامت بتطوير لغة استعلام جديدة أسمتها XPath، وهي التي أطلق الإصدار الأول من معاييرها عام 1999، وأصبحت في الوقت الحاضر مدعومة من قبل معظم لغات البرمجة وبيئات العمل، حيث يمكننا من خلالها تعابيرها التنقل بسهولة ضمن وثيقة XML واختيار عقدها. بكلام آخر فقد أتاحت XPath تعابير سهلة وقابلة للفهم تستطيع من خلالها اختيار أي عقدة أو مجموعة عقد من وثيقة XML ما.

سيكون من غير الإنصاف محاولة عرض لغة جديدة بشكل أكاديمي في بضع صفحات لمقالة ضمن مدونة، لذا سألجأ إلى مقاربة أخرى ألا وهي التعليم من خلال الأمثلة، فإن كنت من الذين ينشدون النتائج العملية بأقصر الطرق دون الرغبة في الغوص في أعماق التقنية ذاتها، إن كنت كذلك فعلى الأغلب ستجد ضالتك هنا. وإن كنت من الذين تقودهم أسئلتهم كيف؟ ولماذا؟ فعلى أقل تقدير أعتقد أن هذه المقالة المتواضعة ستشد إنتباهك بشكل كاف حتى يتكفل من بعدها فضولك الخاص في دفعك نحو استقصاء غياهب لغة الاستعلام هذه وأسرارها.

دعونا قبل الحديث عن التعلم من خلال الأمثلة أن نتعرف على ملف XML الذي سنستخدمه كمثال في هذه المقالة:


ألا تذكرون معي أننا قلنا في بداية هذه المقالة أن إحدى مزايا لغة XML أنها تفسّر نفسها بنفسها، أظن أن هذه الفكرة باتت واضحة الآن بعد إطلاعكم على المثال السابق، فهو لبيانات تخص متجر كتب يتضمن معلومات حول ثلاثة كتب لكل منها عنوان وسعر مع بعض الخصائص هنا وهناك كما هي حال رقم ISBN للكتب أو اللغة لبعض العناوين، وكما هو واضح فإن التنسيق المستخدم في هذا الملف هو UTF-8 لذا أمكننا أن نزاوج بين بيانات عربية وإنجليزية في ذات الوثيقة دون أي مشاكل تذكر.

قارئي العزيز، قليلا من الصبر بعد، فأنت لا ترغب أن تقرأ المثال وترى النتيجة دون أن تكون قادرا على أن تختبرها بنفسك، أليس كذلك؟ هذه على الأقل حالي عندما أقرأ أي مقال برمجي، لذا دعوني أقدم لكم برنامج XML Notepad وهو برنامج حر مفتوح المصدر من Microsoft! والذي يمكنكم الحصول عليه من خلال الرابط التالي:

http://xmlnotepad.codeplex.com

وهو يتيح لكم فتح ملفات XML واستعراض محتوياتها ضمن بنيتها الهرمية بشكل سهل وبسيط، والأهم بالنسبة لنا أنك تستطيع أن تبحث ضمن ملف XML المفتوح باستخدام صيغ وعبارات لغة XPath والتي سيتلو ذكرها بعد قليل. لذا بعد أن تنشئ ملف XML السابق الذكر وتفتحه باستخدام هذا البرنامج:

يمكنك تنفيذ أي استعلام XPath وذلك من خلال قائمة Edit ومن ثم خيار Find وستظهر لك حينها النافذة التالية:

وهكذا، بعد أن اكتملت عدّتنا، دعونا نبدأ في استكشاف لغة XPath من خلال الأمثلة كما سبق وأن أشرنا في عنوان مقالتنا هذه:

للحصول على كافة عناوين الكتب ضمن متجر الكتب

/bookstore/book/title

للحصول على كل عقد العناوين بغض النظر عن هرمية وثيقة XML ومكان عقد العناوين تلك فيها

//title

للحصول على كل عقد الكتب بما تتضمنه من عقد أبناء شريطة أن تكون متفرعة عن عقدة متجر الكتب

bookstore/book

لاحظ أننا لا نستخدم الرمز / في بداية الاستعلام إن كان المسار المرغوب البحث عنه نسبي، أما في حال كونك ترغب في الإشارة إلى مسار مطلق (كامل) فعليك إضافة الرمز / إلى بداية الاستعلام كما هي الحال مع المثال الأول.

للحصول على عقدة العنوان للكتاب الأول (بكل ما يتفرع عنها من هرمية وثيقة XML) ضمن متجر الكتب

/bookstore/book[1]/title

للحصول على عقدة العنوان للكتاب ما قبل الأخير ضمن متجر الكتب

/bookstore/book[last()-1]/title

للحصول على كافة عقد العناوين التي تمتلك خاصية lang

//title[@lang]

للحصول على كافة عقد العناوين التي تمتلك القيمة en لخاصية lang فيها

//title[@lang = ‘en’]

للحصول على عناوين كافة الكتب التي لها عقدة تسعيرة فرعية قيمتها تزيد على 10

/bookstore/book[price > 10]/title

لاحظ أننا نستخدم الرمز @ قبل اسم الخاصية وليس قبل اسم العقدة الابن

للحصول على كافة عقد العناوين والتي تمتلك أي خاصة كانت

//title[@*]

لاسترجاع عقد العناوين والتسعيرات المتفرعة عن عقد الكتب أيا كان مكانها في هيكلية وثيقة XML الهرمية

//book/title | //book/price

للحصول على عناوين أي عقدة متفرعة عن عقدة bookstore مثلا dvd لو كانت موجودة

/bookstore/*/title

لاستعادة قيم خاصية isbn لكافة عقد الكتب ضمن متجر الكتب

/bookstore/book/@isbn

للحصول على عناوين الكتب التي قيمة خاصية isbn  لها أكبر من 100 وسعرها (عقدة الابن) أكبر من عشرين

//book[@isbn > 200 and price > 20.00]/title

للحصول على كافة عناوين الكتب التي لا تملك خاصية lang في العقدة الفرعية الخاصة بالعنوان

//book/title[not(@lang)]

للحصول على عناوين الكتب ذات الترتيب الزوجي ضمن وثيقة XML المعطاة

//book[position() mod 2 = 0]/title

حسنا، إن كنت عزيزي القارئ من قوم المبرمجين، فلا بد أنك معجب بما تستطيع لغة XPath القيام به بهذا القدر من السهولة والبساطة، وربما سيجول بخاطرك حتما أن لغة XPath بالنسبة لملفات XML تقوم بذات الدور الذي تقوم به لغة SQL بالنسبة لقواعد البيانات (وهذا صحيح تماما). لكن من جهة أخرى لابد أنك في حيرة من أمرك، إذ كيف ستسخّر مثل تلك القدرة ضمن شيفراتك البرمجيّة؟ إن كان هذا مبعث قلقك قلا تحزن، فمعظم لغات البرمجة باتت توفر دعما أصيلا لاستعلامات XPath كجزء من دعمها للعمل مع تنسيقات XML وسأقوم هنا باستعراض أمثلة بسيطة بثلاثة لغات واسعة الانتشار في بلدنا الحبيب سوريا.

المثال الأول يوضح كيفيّة تنفيذ استعلام XPath على محتويات وثيقة XML باستخدام لغة ASP.NET:

XmlDocument   xmldoc = new XmlDocument();
xmldoc.Load(Server.MapPath("~/App_Data/ bookstore.xml"));
Response.Write(xmldoc.SelectSingleNode("/bookstore/book[1]/title").InnerText);

أما هذا المثال الثاني فيوضح كيفيّة تنفيذ استعلام XPath على محتويات وثيقة XML باستخدام لغة PHP:

<?php
$xml = simplexml_load_file("App_Data/ bookstore.xml")
                        or die ("Unable to load XML file!");

foreach ($xml->xpath('/bookstore/book[1]/title') as $type) {
    echo "$type<br/>\n";
}
?>

أخيرا يوضح المثال الثالث التالي كيفيّة تنفيذ استعلام XPath على محتويات وثيقة XML باستخدام لغة Java:

import org.w3c.dom.*;
import javax.xml.xpath.*;
import javax.xml.parsers.*;
import java.io.IOException;
import org.xml.sax.SAXException;

public class XPathDemo {
    public static void main(String[] args)
    throws ParserConfigurationException, SAXException,
    IOException, XPathExpressionException {
        DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
        domFactory.setNamespaceAware(true);
        DocumentBuilder builder = domFactory.newDocumentBuilder();
        Document doc = builder.parse("bookstore.xml");
        XPath xpath  = XPathFactory.newInstance().newXPath();

        // XPath Query for showing all nodes value
        XPathExpression expr = xpath.compile("/bookstore/book[1]/title");

        Object result  = expr.evaluate(doc, XPathConstants.NODESET);
        NodeList nodes = (NodeList) result;
        for (int i = 0; i < nodes.getLength(); i++) {
            System.out.println(nodes.item(i).getNodeValue());
        }
    }
}

في الختام، أرجو أن تكون هذه المقالة المتواضعة قد فتحت أمام ناظريك قارئي الكريم باب جديدا وقدمت إليك وجبة دسمة من المعلومات التي آمل أن تكون جديدة بالنسبة لك، وفي نهاية المطاف غايتي أن أكون قد حفزت فضولك للإطلاع على ما هو أعمق من مجرد مقدمة بسيطة في لغة XPath للاستعلام.

 
 

الأوسمة: ,

7 responses to “تعلم XPath بالأمثلة

  1. Abd Allah Diab

    6 مارس 2011 at 2:36 مساءً

    شكراً لك على المقدمة الجميلة للغة XPath🙂
    عندي ملحوظة صغيرة, أعتقد أنك تقصد ISBN ولا تقصد ISDN😉

    تحياتي

     
    • خالد الشمعة

      6 مارس 2011 at 3:13 مساءً

      هههههه، شكرا على التصويب، أنت محق تماما، وسأقوم بتصحيحها فورا

       
  2. عبد الفتاح دباس

    7 مارس 2011 at 11:35 صباحًا

    شكرا على المقالة الجميلة والمفيدة..

     
  3. بن عبد الله يوسف

    6 مايو 2011 at 6:23 مساءً

    السلام عليكم و رحمة الله و بركاته أخي
    مقالة في القمة
    و الله أفدتني كثيرا و أنا من المهتمين بXML و كل ما له علاقة به
    و حقيقة هذه وثيقة نادرة تحسب للغة العربية
    نتمنى منك المزيد إن شاء الله
    و ربي يجازيك أخي الكريم ويوفقك
    تحياتي الخالصة

     
  4. WWW

    29 أبريل 2012 at 5:40 صباحًا

    متشكر جدا
    انت انقذتني من ورطة
    جزاك الله خيرا

     
  5. Mohamed

    4 يونيو 2015 at 11:14 صباحًا

    شكرا جزيلاً خالد اسلوب رائع

     

أضف تعليقاً

إملأ الحقول أدناه بالمعلومات المناسبة أو إضغط على إحدى الأيقونات لتسجيل الدخول:

WordPress.com Logo

أنت تعلق بإستخدام حساب WordPress.com. تسجيل خروج   / تغيير )

صورة تويتر

أنت تعلق بإستخدام حساب Twitter. تسجيل خروج   / تغيير )

Facebook photo

أنت تعلق بإستخدام حساب Facebook. تسجيل خروج   / تغيير )

Google+ photo

أنت تعلق بإستخدام حساب Google+. تسجيل خروج   / تغيير )

Connecting to %s

 
%d مدونون معجبون بهذه: