پرس و جوی محتوای XML با XPath

XPath پیشنهاد رسمی W3C برای پرس و جو و جست و جو در محتوای XML است، در حقیقت XPath استانداری است که زبانی را در اختیار ما قرار می‌دهد که با استفاده از آن می‌توانیم المان‌ها و صفت‌ها مختلف یک فایلXML را مورد بررسی قرار دهیم.

XPath دارای ویژگی‌ها و امکانات زیر است:

Path Expression

Path Expression عبارت متنی است که به ما اجازه می‌دهد گره یا گره‌هایی را از داخل یک محتوای XML استخراج کنیم، جدول زیر عبارات مهم و کاربردی Path Expression را نشان می‌دهد.

عبارت عملکرد
node-name به کار بردن نام گره باعث می‌شود تا تمام گره‌های با نام مورد نظر انتخاب شوند.
/ مشخص می‌کند که انتخاب و جست و جو از ابتدای فایل صورت گیرد.
// تمام گره‌ها صرف نظر از مکان آن‌ها انتخاب می‌شوند.
. گره فعلی را انتخاب می‌کند.
.. پدر گره فعلی را انتخاب می‌کند.
@ برای انتخاب بر حسب صفت به کار می‌رود.

Predicates

پس از ساخت یک لیست توسط Path Expression با استفاده از Predicate می‌توانیم گره یا گره‌های خاصی را انتخاب می‌کنیم، Predicate با عبارت […] مشخص می‌شود که به جای … می‌توانیم از توابع استاندارد، اندیس یا عبارات پیچیده تر برای انتخاب گره‌های خاص استفاده کنیم، در ادامه با مثال با این موضوع آشنا می‌شویم:

عبارت عملکرد
/class/student[1] اولین گره student که زیر گره class باشد را انتخاب می‌کند.
/class/student[3] سومین گره student که زیر گره class باشد را انتخاب می‌کند.
/class/student[last()] آخرین گره student که زیر گره class باشد را انتخاب می‌کند.
/class/student[last()-1] گره ماقبل آخر را با شرایط قبلی انتخاب می‌کند.
//student[@sid=’333’] تمام گره‌های student که دارای sid برابر با 333 هستند را انتخاب می‌کند.
/class/student[position()<3] تمام گره‌های student زیر گره class که اندیس آن‌ها از 3 کمتر است را انتخاب می‌کند (یعنی دو گره ابتدایی انتخاب می‌شوند.)در اینجا اندیس از یک شروع می‌شود.

استفاده از XPath در PHP

برای استفاده از xpath در PHP کافیست که فایل XML را بارگذاری کرده و سپس با استفاده از دستوراتی که در بالا ذکر شده اند، اقدام به انتخاب گره های مورد نظر خود کنید. در ادامه با استفاده از چند مثال به صورت عملی با موارد فوق آشنا می‌شویم. قبل از ادامه یک فایل XML به نام sample.xml ایجاد می‌کنیم و محتوای زیر را در آن می‌نویسیم و در درایو D ذخیره می‌کنیم:

<?xml version="1.0" encoding="utf-8" ?>
<Persons>
  <Person name="John Smith">
    <Age>30</Age>
    <Gender>Male</Gender>
  </Person>
  <Person name="Mike Folley">
    <Age>25</Age>
    <Gender>Male</Gender>
  </Person>
  <Person name="Lisa Carter">
    <Age>22</Age>
    <Gender>Female</Gender>
  </Person>
  <Person name="Jerry Frost">
    <Age>27</Age>
    <Gender>Male</Gender>
  </Person>
  <Person name="Adam Wong">
    <Age>35</Age>
    <Gender>Male</Gender>
  </Person>
</Persons>

برای انتخاب گره ها یا افرادی از فایل بالا که سن (Age) آنها بزرگتر یا مساوی 25 سال است به صورت زیر عمل می کنیم :

  1: <?php
  2:     if(!$xml = simplexml_load_file("D:/sample.xml"))
  3:     {
  4:         echo "Unable to load XML file";
  5:     }
  6:     else
  7:     {     
  8:           $persons = $xml->xpath("//Person[Age >= 25]");
  9:           
 10:           foreach($persons as $person)
 11:           {
 12:                echo 'Person Name : ' . $person->attributes() . '<br/>';
 13:                
 14:                foreach($person as $key => $value)
 15:               {
 16:                    echo 'Person ' . $key . ' : ' . $value . '<br/>';
 17:               }
 18:               
 19:               echo '<br/><br/>';
 20:           }                  
 21:     }
 22: ?>
Person Name : John Smith
Person Age : 30
Person Gender : Male

Person Name : Mike Folley
Person Age : 25
Person Gender : Male

Person Name : Jerry Frost
Person Age : 27
Person Gender : Male

Person Name : Adam Wong
Person Age : 35
Person Gender : Male

برای انتخاب گره‌های از نوع Person که جنسیت (Gender) در آن‌ها زن (Female) باشد، کافی است که خط 8 کد بالا را به صورت زیر تغییر دهیم:

$persons = $xml->xpath("//Person[Gender='Female']");
Person Name: Lisa Carter
Person Age: 22
Person Gender: Female

برای انتخاب گره‌ای از نوع Person که نام آن Adam Wong باشد، کافی است که خط 8 کد بالا را به صورت زیر تغییر دهیم:

$persons = $xml->xpath("//Person[@name='Adam Wong']");
Person Name : Adam Wong
Person Age : 35
Person Gender : Male