SimpleXML چیست
PHP چندین روش برای تجزیه فایلهای XML ارائه میدهد که معمولترین آنها استفاده از SimpleXML است. SimpleXML تمام محتویات فایل XML را خوانده و آن را تبدیل به آرایهای از اشیاء میکند. امتیاز SimpleXML این است که برای خواندن محتویات فایل XML نیاز به کدنویسی ندارید. قبل از شروع به یادگیری SimpleXML نگاهی به برخی از متدهای پرکاربرد آن میاندازیم:
تابع | توضیح |
()__construct | یک شیء جدید از SimpleXMLElement ایجاد میکند. |
()addAttribute | یک خاصیت به عنصر خاص اضافه میکند. |
()addChild | یک زیر گره به یک گره خاص اضافه میکند. |
()asXML | فایل XML را در قالب یک رشته بر میگرداند. |
()attributes | خاصیتها/مقادیر یک عنصر را بر میگرداند. |
()children | گرههای فرزند یک گره خاص را بر میگرداند. |
()count | تعداد زیر گرههای یک گره خاص را میشمارد. |
()getDocNamespaces | فضای نام تعریف شده در سند را بر میگرداند. |
()getName | نام گره XML را بر میگرداند. |
()getNamespaces | فضای نام استفاده شده در سند را بر میگرداند. |
()saveXML | مترادف ()asXML |
()simplexml_load_file | یک فایل XML را به شیء SimpleXMLElement تبدیل میکند. |
()simplexml_load_string | یک رشته XML را به شیء SimpleXMLElement تبدیل میکند. |
توابع گردش در SimpleXML
تابع | توضیح |
()current | گره جاری را بر میگرداند. |
()getChildren | زیرگره های گره جاری را بر میگرداند. |
()hasChildren | چک میکند که آیا گره جاری دارای زیر گرهای است یا نه؟ |
()key | کلید جاری را بر میگرداند. |
()next | حرکت به سمت گره بعدی |
()rewind | رفتن به عنصر اولی |
()valid | چک میکند که آیا گره جاری معتبر است یا نه؟ |
فرض کنید میخواهیم همان فایل XML درس قبل را با استفاده از SimpleXml ایجاد کنیم :
<?php $dom=<<<XML <?xml version="1.0"?> <Persons> <Person name="John Smith"> <Age>30</Age> <Gender>Male</Gender> </Person> <Person name="Mike Folly"> <Age>25</Age> <Gender>Male</Gender> </Person> <Person name="Lisa Carter"> <Age>22</Age> <Gender>Female</Gender> </Person> </Persons> XML; $xml=new SimpleXMLElement($dom); $xml->saveXML('sample.xml'); ?>
همانطور که در کد بالا مشاهده میکنید تنها کاری که ما انجام دادهایم این است که ساختار مورد نظرمان را در داخل یک رشته (خطوط 18-2) نوشته و سپس به سازنده کلاس SimpleXMLElement (خط 20) ارسال و در نهایت با استفاده از متد ()saveXML ذخیره کردهایم. به همین راحتی! با این اجرای کد بالا فایل XML مورد نظرمان ایجاد میشود. همانطور که در کد بالا مشاهده میکنید گره اصلی (Persons) شامل سه گره فرزند (Person) است و هر گره فرزند خود دارای سه گره فرزند Name ،Age و Gender میباشد.
بارگذاری یا Load فایل XML
برای خواندن فایل XML از متد ()simplexml_load_file استفاده میشود :
<?php $Persons = simplexml_load_file('c:/wamp/www/sample.xml'); echo '<pre>'; print_r($Persons); echo '</pre>'; ?>
SimpleXMLElement Object ( [Person] => Array ( [0] => SimpleXMLElement Object ( [@attributes] => Array ( [name] => John Smith ) [Age] => 30 [Gender] => Male ) [1] => SimpleXMLElement Object ( [@attributes] => Array ( [name] => Mike Folly ) [Age] => 25 [Gender] => Male ) [2] => SimpleXMLElement Object ( [@attributes] => Array ( [name] => Lisa Carter ) [Age] => 22 [Gender] => Female ) ) )
همانطور که در خروجی بالا مشاهده میکنید گره یا عنصر اصلی (Persons) آرایهای از اشیاء Person است. که این آرایه خود دارای سه عنصر میباشد. که این عناصر همان گرههای موجود در فایل XML هستند. هر عنصر در این آرایه یک شیء است که شامل خاصیتهای Name ،Age و Gender میباشد. با این فایل XML در درسهای آینده کار میکنیم.
متد ()addAttribute
متد ()addAttribute یک خاصیت به عنصر خاص اضافه میکند. مثلاً برای اضافه کردن یک خاصیت به اولین عنصر person فایل XML ی که در بالا ایجاد کردهایم به صورت زیر عمل میکنیم :
<?php $Persons = simplexml_load_file('c:/wamp/www/sample.xml'); $firstPerson = $Persons->Person[0]; $firstPerson->addAttribute("Country","USA"); $Persons->saveXML('sample.xml'); ?>
با اجرای کد بالا یک خاصیت با نام Country و مقدار USA به اولین شخص یا گره اضافه میشود:
متد ()addChild
متد ()addChild یک گره به یک گره خاص اضافه میکند. مثلاً برای اضافه کردن یک گره به اولین عنصر person فایل XML مان به صورت زیر عمل میکنیم :
<?php $Persons = simplexml_load_file('c:/wamp/www/sample.xml'); $firstPerson = $Persons->Person[0]; $firstPerson->addChild("Height","170"); $Persons->saveXML('sample.xml'); ?>
با اجرای کد بالا فایل XML به صورت زیر در میآید :
متد ()Attributes
متد ()Attributes خاصیتها/مقادیر یک عنصر را بر میگرداند.
<?php $Persons = simplexml_load_file('c:/wamp/www/sample.xml'); $Attributes = $Persons->Person[0]->attributes(); echo $Attributes; ?>
John Smith
هانطور که در کد بالا مشاهده میکنید در حالت پیشفرض این متد مقدار اولین خاصیت را بر میگرداند. مثلاً گره Person دو خاصیت name و Country دارد که مقدار خاصیت name را بر گرداند. برای به دست آوردن یک خاصیت خاص مثل Country باید نام آن را بنویسید :
<?php $Persons = simplexml_load_file('c:/wamp/www/sample.xml'); $Attributes = $Persons->Person[0]->attributes()->Country ; echo $Attributes; ?>
USA
و برای به دست آوردن تمامی مقادیر خاصیتها از حلقه foreach به صورت زیر استفاده میکنیم :
<?php $Persons = simplexml_load_file('c:/wamp/www/sample.xml'); foreach($Persons->Person[0]->attributes() as $key => $value) { echo $value .'<br/>'; } ?>
John Smith USA
متد ()children
متد ()children مقادیر موجود در زیرگره های یک گره خاص را بر میگرداند. مثلاً گره Person دارای سه زیر گره است و میخواهیم مقادیر موجود در آنها را به دست آوریم :
<?php $Persons = simplexml_load_file('c:/wamp/www/sample.xml'); foreach($Persons->Person[0]->children() as $child) { echo $child .'<br/>'; } ?>
30 Male 170
حال اگر به فایل XML مراجعه کنید، متوجه میشوید که مقادیر موجود در Age و Gender و Height برگشت داده شده است.
متد ()count
متد ()count تعداد زیر گرههای یک گره را بر میگرداند. مثلاً تعداد زیر گرههای اولین گره Person به صورت زیر محاسبه میشود :
<?php $Persons = simplexml_load_file('c:/wamp/www/sample.xml'); $childNumber= $Persons->Person[0]->children(); echo $childNumber -> count(); ?>
3
زیر گرههای Person عبارتاند از Age، Gender و Height.
متد ()getName
از متد ()getName برای به دست آوردن نام یک گره یا زیر گره استفاده میشود. فرض کنید که میخواهیم نام تمام زیر گرههای، اولین گره Person را به دست بیاوریم :
<?php $Persons = simplexml_load_file(''c:/wamp/www/sample.xml'); foreach ($Persons->Person[0]->children() as $child) { echo $child->getName() . "<br>"; } ?>
Age Gender Height