برای خواندن ، به روز کردن ، ایجاد کردن و ویرایش کردن فایل xml به یک پارسر xml نیاز داریم .
دو نوع پارسر xml وجود دارد :
  • پارسر بر مبنای ساختار درختی :
این نوع پارسر ابتدا تمام محتویات فایل xml را پردازش می کند سپس محتویات درون فایل xml را روی یک درخت پیاده سازی می کند . از این به بعد این نوع پارسر به هر قسمتی از فایل xml به راحتی دسترس دارد که اصطلاحا به این ساختار درختی مدل dom گفته می شود
  • پارسر رویداد گرا
در نظر این نوع پارسر ، محتویات فایل xml  مجموعه ای از رویداد ها می باشد . زمانی که رویدادی روی دهد ، این نوع پارسر تابعی را برای مدیریت ان فراخوانی می کند
 
 پارسر Expat  از نوع رویداد گرا می باشد . پارسر رویداد گرا رو ی محتوای فایل xml تمرکز می کند نه روی ساختار ان  . در نتیجه دستورسی به داده ها توسط پارسر رویدادگرا سریع تر زمانی است که از پارسر درختی استفاده می شود
 
 فرض کنید دستور xml زیر وجود دارد :

 

<from>Jani</from>
انچه  یک پارسر  رویداد گرا از تجزیه و تحلیل این دستور گزارش می دهد شامل سه رویداد  زیر است :

 

  • Start element: from
  • Start CDATA section, value: Jani
  • Close element: from

 که

from می شود المنت اغازین

اغاز داده با یک cdata است و مقدار ان Jani است

المنت نهایی from است

 

 نکته :

پارسر expat جزئی از هسته php است و نیازی به نصب شدن ندارد

 
 فایل xml زیر را در نظر بگیرید :

 

<?xml version="1.0" encoding="UTF-8"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

 
 بررسی عملکر پارسر xml برای این مثال :

 ما ابتدا یک پارسر xml می سازیم

سپس رویدادهای مختلف را سامان دهی می کنیم

سپس محتویات فایل xml را با پارسر تجزیه و تحلیل می کنیم

 
 مثال :

 

<?php
//Initialize the XML parser
$parser=xml_parser_create();

//Function to use at the start of an element
function start($parser,$element_name,$element_attrs)
  {
  switch($element_name)
    {
    case "NOTE":
    echo "-- Note --<br>";
    break;
    case "TO":
    echo "To: ";
    break;
    case "FROM":
    echo "From: ";
    break;
    case "HEADING":
    echo "Heading: ";
    break;
    case "BODY":
    echo "Message: ";
    }
  }

//Function to use at the end of an element
function stop($parser,$element_name)
  {
  echo "<br>";
  }

//Function to use when finding character data
function char($parser,$data)
  {
  echo $data;
  }

//Specify element handler
xml_set_element_handler($parser,"start","stop");

//Specify data handler
xml_set_character_data_handler($parser,"char");

//Open XML file
$fp=fopen("test.xml","r");

//Read data
while ($data=fread($fp,4096))
  {
  xml_parse($parser,$data,feof($fp)) or
  die (sprintf("XML Error: %s at line %d",
  xml_error_string(xml_get_error_code($parser)),
  xml_get_current_line_number($parser)));
  }

//Free the XML parser
xml_parser_free($parser);
?>

 
 خروجی برنامه بالا :

 

-- Note --
To: Tove
From: Jani
Heading: Reminder
Message: Don't forget me this weekend!

 
 این برنامه چگونه کار می کند ؟
  1.  با تابع xml_parser_create یک پارسر xml می سازیم
  2. توابعی که می خواهیم با هر رویدادی دستوراتش اجرا شود ایجاد می کنیم
  3. با استفاده از تابع xml_set_element_handler مشخص می کنیم که در زمان باز کردن و بستن یک تگ چه تابعی باید اجرا شود
  4. با استفاده از تابع xml_set_character_data_handler مشخص می کنیم که هرگاه پارسر به یک کاراکتر داده ای برخورد کرد دستورا ت کدام تابع اجرا شود
  5. با استفاده از تابع xml_parse عملیات تجزیه و تحلیل کردن فایل test.xml اغاز می شود
  6. در صورت بروز خطا ، با استفاده از تابع xml_error_string رشته ای را که شامل توضیحاتی درباره خطای روی داده شده است ایجاد می کنیم
  7. در نهایت برای ازاد کردن فضای حافظه ram از پارسری که ساخته بودیم از تابع xml_parser_free استفاده می کنیم