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