Document Object Model یا DOM چیست

Document Object Model يک رابط برنامه نويسی برای سندهای XML و HTML است. با استفاده از DOM، نحوه دستيابی و انجام پردازش‌های لازم در رابطه با سندهای XML و HTML فراهم می‌گردد. برنامه نويسان با استفاده از DOM، قادر به ايجاد يک سند، حرکت در طول ساختار سند، افزودن، اصلاح و يا حذف عناصر (گره‌های) يک سند XML و يا HTML می‌باشند. DOM توسط کنسرسيوم وب استاندارد و بمنظور استفاده از طريق زبانهای برنامه نويسی متعددی طراحی شده است. در PHP کلاس‌ها و متدهایی برای کار با سند XML وجود دارد که در این درس با آنها آشنا خواهید شد.

ایجاد فایل XML

برای ایجاد و ذخیره کردن یک فایل XML ابتدا یک فایل با نام XMLDemo.php در پوشه www ایجاد کرده و سپس کدهای زیر را در داخل آن بنویسید :

<?php
   $dom = new DOMDocument('1.0');
   $dom->formatOutput = true;
   $domString = $dom->saveXML();
   $dom->save( 'sample.xml' );
?>

همانطور که در کد بالا مشاهده می‌کنید شییء از کلاس DomDocument ایجاد کرده‌ایم و مقدار 1.0 را به آن ارسال کرده‌ایم. این کلاس مسئول به وجود آوردن سند XML است. formatOutput مسئول قالب بندی (ایجاد تو رفتگی) گره‌ها می‌باشد. متد ()saveXML باعث ذخیره موقتی کدها در یک رشته و متد ()Save باعث ذخیره نهایی آن در یک فایل می‌شود. با اجرای کد بالا، فایلی به صورت زیر ایجاد می‌شود :

حال اگر فایل بالا را باز کنید، محتویات آن به صورت زیر خواهد بود :

ایجاد گره مادر (root)

برای ایجاد گره مادر در فایل XML به روش زیر عمل می‌شود :

$Persons = $dom->appendChild($dom->createElement('Persons'));

ابتدا یک متغیر تعریف می‌کنیم (چون با این متغیر در ادامه کار داریم) سپس نام شئ dom$ را می‌آوریم. این بدین معناست که می‌خواهیم در سند ایجاد شده یک گره ایجاد کنیم. حال با فراخوانی متد()appendChild که مسئول اضافه کردن گره به سند است و ارسال خروجی تابع ()createElement که گره را ایجاد می‌کند (از این متد خواسته‌ایم که یک گره با نام Persons ایجاد کند) به آن اولین گره یا همان گره مادر را ایجاد می‌کنیم:

ممکن است این سؤال برایتان پیش بیاید که چرا گره تگ پایانی ندارد؟ بعد از اضافه کرده زیر گره این گره به صورت خودکار بسته می‌شود.

ایجاد زیر گره

برای ایجاد زیر گره به گره مادر، در فایل XML به روش زیر عمل می‌شود :

$Person = $Persons->appendChild($dom->createElement('Person'));

تنها تفاوت ایجاد زیر گره با گره مادر در این است که در سمت راست علامت مساوی نام گره مادر ایجاد شده در بالا (متغیر Persons) را می‌نویسیم:

اضافه کردن خاصیت به گره

برای اضافه کردن خاصیت به گره به صورت زیر عمل می‌شود :

$Person ->setAttribute("name", "John Smith");

برای این کار ابتدا نام متغیری که گره در آن قرار داده شده است را نوشته و سپس با استفاده از متد ()setAttribute خاصیتی به آن اختصاص می‌دهیم:

اضافه کردن مقدار به گره

فرض کنید که می‌خواهیم یک زیر گره به یک گره اضافه کرده و مقداری در داخل آن بنویسیم :

$Age    =  $Person -> appendChild($dom->createElement('Age'));
$Age    -> appendChild($dom->createTextNode('30'));

در کد بالا یک گره به نام Age به گره Person اضافه می‌کنیم و سپس با استفاده از متد ()createTextNode مقداری به آن اضافه می‌کنیم:

در زیر مثال کاملی با توجه به آموزش‌های بالا آورده شده است :

<?php
    $dom = new DomDocument('1.0');
    
    $Persons = $dom->appendChild($dom->createElement('Persons'));
    
    $Person =  $Persons->appendChild($dom->createElement('Person'));
    $Person -> setAttribute("name", "John Smith");
    $Age    =  $Person -> appendChild($dom->createElement('Age'));
    $Age    -> appendChild($dom->createTextNode('30'));
    $Gender =  $Person -> appendChild($dom->createElement('Gender'));
    $Gender -> appendChild($dom->createTextNode('Male'));
    
    $Person =  $Persons->appendChild($dom->createElement('Person'));
    $Person -> setAttribute("name", "Mike Folly");
    $Age    =  $Person -> appendChild($dom->createElement('Age'));
    $Age    -> appendChild($dom->createTextNode('25'));
    $Gender =  $Person -> appendChild($dom->createElement('Gender'));
    $Gender -> appendChild($dom->createTextNode('Male'));
    
    $Person =  $Persons->appendChild($dom->createElement('Person'));
    $Person -> setAttribute("name", "Lisa Carter");
    $Age    =  $Person -> appendChild($dom->createElement('Age'));
    $Age    -> appendChild($dom->createTextNode('22'));
    $Gender =  $Person -> appendChild($dom->createElement('Gender'));
    $Gender -> appendChild($dom->createTextNode('Female'));
    
    $dom->formatOutput = true;
    $domString = $dom->saveXML();
    $dom->save('sample.xml');
?>

نتیجه اجرای کد بالا :

به دست آوردن مقدار خاصیت یک گره

حال فرض کنید که می‌خواهیم مقدار خاصیت‌هایی که با رنگ زرد در شکل زیر مشخص شده است را به دست آوریم

برای این کار به صورت زیر عمل می‌کنیم :

  1: <?php
  2: 	$dom = new DOMDocument();
  3: 	$dom->load( 'sample.xml' );
  4: 	$searchNode = $dom->getElementsByTagName( "Person" );
  5: 	foreach( $searchNode as $searchNode )
  6: 	{
  7: 		$PersonName        = $searchNode   -> getAttribute('name');
  8: 		$PersonAge         = $searchNode   -> getElementsByTagName( "Age" );
  9: 		$PersonAgeValue    = $PersonAge    -> item(0)->nodeValue;
 10: 		$PersonGender      = $searchNode   -> getElementsByTagName( "Gender" );
 11: 		$PersonGenderValue = $PersonGender -> item(0)->nodeValue;
 12: 		echo $PersonName        .'<br/>'
 13: 		   . $PersonAgeValue   .'<br/>'
 14: 		   . $PersonGenderValue.'<br/><br/>';
 15: 	}
 16: ?>
John Smith
30
Male
Mike Folly
25
Male
Lisa Carter
22
Female

در کد بالا و با استفاده از متد ()Load، فایل XML را باز یا بارگذاری می‌کنیم. سپس در خط 4 و با استفاده از متد ()getElementsByTagName به عنصر یا عناصری که دارای نام person هستند دست می‌یابیم. با استفاده از متد ()getAttribute در خط 7 مقدار خاصیت name گره‌ها و با استفاده از nodeValue مقدار موجود بین عناصر Age و Gender را به دست می‌آوریم.

به دست آوردن مقدار موجود در زیر گره‌های یک گره خاص

فرض کنید که می‌خواهیم مقدار موجود در زیر گره‌های Age و Gender را به دست آوریم برای این کار به صورت زیر عمل می‌کنیم :

<?php
    $dom = new DOMDocument();
    $dom->load( 'sample.xml' );
    $Person = $dom->documentElement;
    $NodeText = $Person->getElementsByTagName('Person')->item(0);
    echo $NodeText->textContent;
?>
30 Male

حذف یک گره

برای حذف یک گره و زیر گره‌های آن از متد ()removeChild به صورت زیر استفاده می‌شود :

<?php
    $dom = new DOMDocument();
    $dom -> load( 'sample.xml' );
    $Person = $dom -> documentElement;
    $NodeToRemove = $Person -> getElementsByTagName("Person") -> item(0);
    $RemoveChild  = $Person -> removeChild($NodeToRemove);
    $dom->saveXML();
    $dom->save('sample.xml');
?>
Mike Folly
25
Male
Lisa Carter
22
Female

در خط 6 کد بالا اعلام می‌کنیم که یک عنصر را می‌خواهیم. سپس در خط 8 آیتم صفرم یعنی اولین گره از گره‌هایی که نام آنها Person است را به آن انتصاب می‌دهیم. و در خط 9 با استفاده از متد ()removeChild آن را حذف و در آخر فایل را ذخیره می‌کنیم. متدهای زیادی در PHP برای کار با فایل‌های XML وجود دارد که در سایت رسمی php.net لیست کامل آنها وجود دارد :

چون تمرکز ما بیشتر روی افزونه Simplexml است به همین مقدار بسنده می‌کنیم.