Document Object Model یا DOM چیست

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

 

ایجاد فایل XML

برای ایجاد و ذخیره کردن یک فایل XML به صورت زیر عمل می شود :

 <?php
    $DOM = new DOMDocument('1.0');

    $DOM->formatOutput = true;
     
    $DOMString = $DOM->saveXML();
    
    $DOM->save( 'myXMLFile.xml' );
?>

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

xml-dom-in-php-02

 

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

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

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

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

create-xml-file-02
ممکن است این سوال برایتان پیش بیاید که چرا گره تگ پایانی ندارد؟ بعد از اضافه کرده زیر گره این گره به صورت خودکار بسته می شود.

 

ایجاد زیر گره

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

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

تنها تفاوت ایجاد زیر گره با گره مادر در این است که در سمت راست علامت مساوی نام گره مادر ایجاد شده در بالا (متغیر Persons) را می نویسیم.
create-xml-file-03

 

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

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

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

برای این کار ابتدا نام متغیری که گره در آن قرار داده شده است را نوشته و سپس با استفاده از متد ()setAttribute خاصیتی به آن اختصاص می دهیم.
create-xml-file-04

 

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

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

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

در کد بالا یک گره به نام Age به گره Person اضافه می کنیم و سپس با استفاده از متد ()createTextNode مقداری به آن اضافه می کنیم.
create-xml-file-05
در زیر مثال کاملی با توجه به آموزش های بالا آورده شده است :

   1:<?php 
   2:     $DOM = new DomDocument('1.0'); 
   3:
   4:     $Persons = $DOM->appendChild($DOM->createElement('Persons')); 
   5:
   6:     $Person = $Persons->appendChild($DOM->createElement('Person'));
   7:     $Person ->setAttribute("name", "John Smith");     
   8:     $Age    = $Person -> appendChild($DOM->createElement('Age'));
   9:     $Age    -> appendChild($DOM->createTextNode('30'));
  10:     $Gender = $Person -> appendChild($DOM->createElement('Gender'));
  11:     $Gender -> appendChild($DOM->createTextNode('Male'));
  12:     
  13:     $Person = $Persons->appendChild($DOM->createElement('Person'));
  14:     $Person ->setAttribute("name", "Mike Folly");     
  15:     $Age    = $Person -> appendChild($DOM->createElement('Age'));
  16:     $Age    -> appendChild($DOM->createTextNode('25'));
  17:     $Gender = $Person -> appendChild($DOM->createElement('Gender'));
  18:     $Gender -> appendChild($DOM->createTextNode('Male'));
  19:     
  20:     $Person = $Persons->appendChild($DOM->createElement('Person'));
  21:     $Person ->setAttribute("name", "Lisa Carter");     
  22:     $Age    = $Person -> appendChild($DOM->createElement('Age'));
  23:     $Age    -> appendChild($DOM->createTextNode('22'));
  24:     $Gender = $Person -> appendChild($DOM->createElement('Gender'));
  25:     $Gender -> appendChild($DOM->createTextNode('Female'));
  26:
  27:     $DOM->formatOutput = true; 
  28:                                
  29:     $DOMString = $DOM->saveXML(); 
  30:     
  31:     $DOM->save('myXMLFile.xml'); 
  32: ?>

نتیجه اجرای کد بالا :
create-xml-file-06

 

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

حال فرض کنید که می خواهیم مقدار خاصیت هایی که با رنگ زرد در شکل زیر مشخص شده است را به دست آوریم
xml-dom-in-php-01

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

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

Mike Folly
25
Male

Lisa Carter
22
Female

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

 

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

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

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

 

حذف یک گره

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

   1:<?php
   2:    $DOM = new DOMDocument();
   3:
   4:    $DOM->load( 'myXMLFile.xml' );
   5:
   6:    $Person = $DOM->documentElement;
   7:
   8:    $NodeToRemove = $Person->getElementsByTagName("Person")->item(0);
   9:    $RemoveChild  = $Person->removeChild($NodeToRemove);
  10:
  11:    $DOM->saveXML();
  12:
  13:    $DOM->save('myXMLFile.xml');
  14:?>
Mike Folly
25
Male

Lisa Carter
22
Female

در خط 6 کد بالا اعلام می کنیم که یک عنصر را می خواهیم. سپس در خط 8 آیتم صفرم یعنی اولین گره از گره هایی که نام آنها Person است را به آن انتصاب می دهیم. و در خط 9 با استفاده از متد ()removeChild آن را حذف و در آخر فایل را ذخیره می کنیم. متدهای زیادی در PHP برای کار با فایل های XML وجود دارد که در سایت رسمی php.net لیست کامل آنها وجود دارد :
http://php.net/manual/en/book.dom.php
چون تمرکز ما بیشتر روی افزونه Simplexml است به همین مقدار بسنده می کنیم.

لطفا اگر نظر، پیشنهاد و یا انتقادی در باره مطلب بالا دارید در قسمت زیر مطرح بفرمایید.