אתה נמצא כאן מדריכים  >>  המלצות ספרים - DOM-XML  >>  יצירת קובץ ה-XML

יצירת קובץ ה-XML

המודול של DOM-XML ב-PHP מאפשר גם יצירה וגם ניתוח של קבצי XML. כברירת מחדל, המודול אינו נטען לתוך PHP, אלא אם כן משנים את הגדרות קובץ ה-ini (extension=php_domxml.so/dll) או מקנפגים את PHP עם המודול (--with-dom). במערכות Linux/Unix ניתן להשתמש גם בפונקציה dl() לטעינת מודול בזמן ריצה.

נכתוב קובץ include בו נגדיר את הפונקציות ליצירת קובץ ה-XML מתוך נתונים שמוזנים לפונקציה. הפונקציה תקבל את שם המדווח, מערך נתונים על הספרים ומפתח קיבוץ, ותחזיר תוכן XML מתאים כמחרוזת. חייב ליצור את האובייקטים של מסמך ה-XML מאותו אובייקט ראשי, לכן כל הפונקציות שבונות חלקים מן המסמך יקבלו פרמטר בו הם יקבלו את אובייקט המסמך לפי ייחוס.
אלמנט (אובייקט) ב-DOM יוצרים עם הפונקציה DomDocument->create_element()
אלמנט מיוחד מסוג טקסט יוצרים עם הפונקציה DomDocument->create_text_node()
כאשר DomDocument הוא המחלקה של אובייקט מסמך ה-XML. (ישנם עוד מתודות ליצירת אובייקטים, אך אלו הן השתיים העיקריות).

פונקציה ליצירת התג <BOOK>:

file name: books_xml_create_func.inc
<?php
  function XML_MakeBook(&$xml_doc
/*פרמטר המקבל את האובייקט של
מסמך ה-XML לפי ייחוס.
*/
,$info
/*מערך מידע אודות הספר.
מפתחות המערך מייצגות את השדה (שם האלמנט),
והערכים מייצגים את המידע באותו אלמנט.
*/
)
  {
     $elem_book=$xml_doc->create_element("BOOK");
/*יצירת האלמנט של הספר.*/

     foreach ($info as $key=>$value)
     {
        $elem=$xml_doc->create_element(strtoupper($key));
/*יצירת האלמנט של כל נתון בספר.*/

        $elem_book->append_child($elem);
/*משרשרים את האלמנט ל-BOOK.*/

        $txt=$xml_doc->create_text_node(utf8_encode($value));
/*טקסט ב-DOM הינו גם אלמנט (אובייקט) מסוג מיוחד.
את המחרוזת שומרים בקידוד ברירת המחדל של XML
שהוא UTF8/Unicode.
*/

        $elem->append_child($txt);
/*משרשרים את אלמנט הטקסט לאלמנט
של הנתון שיצרנו.
*/

     }
     return $elem_book;
/*מחזירים את האלמנט של הספר
בצורת אובייקט של DOM.
*/

  }
?>

פונקציה ליצירת תג השורש (<RECOMMENDS>):

file name: books_xml_create_func.inc
<?php
  function XML_MakeRecommends(&$xml_doc
/*אובייקט מסמך ה-XML.*/
,$reporter
/*שם המדווח.*/
,$books
/*מערך של אלמנטים של BOOK
כאובייקטים של DOM.
*/
,$groupby="author"
/*מפתח הקיבוץ.*/
)
  {
     $groupby=strtoupper($groupby);
  
     $arr_group_books=array();
     foreach ($books as $book)
/*עוברים על כל הספרים במערך,
וממיינים לפי המפתח $groupby.
*/

     {
        $attr_elem
/*מקבל את האלמנט שהוא המפתח.*/
=current($book->get_elements_by_tagname($groupby)
/*מחזיר מערך של כל הילדים של $book
שהתג שלהם הוא $groupby.
*/
);
        $attr_value=strtoupper(($attr_elem)?$attr_elem->get_content():""
/*אם האלמנט מפתח קיים בספר,
אז לוקחים את ערכו,
אחרת לוקחים מחרוזת ריקה.
*/
);
        $arr_group_books[$attr_value][]=$book;
/*שם את הספר במקום הנכון במערך הקבוצות.
המפתחות של המערך הן ערכי הקבוצות.
*/

     }
     ksort($arr_group_books);
/*מסדר את מערך הקבוצות לפי הקבוצות,
שהן המפתחות במערך.
*/

  
     $elem_recommends=$xml_doc->create_element("RECOMMENDS");
/*יוצר את אלמנט השורש.*/

  
     $elem_reporter=$xml_doc->create_element("REPORTER");
/*יוצר את האלמנט של המדווח.*/

     $elem_reporter_name=$xml_doc->create_text_node(utf8_encode($reporter));
/*אלמנט מיוחד השומר בתוכו מחרוזת.
את המחרוזת שומרים בקידוד של UTF8.
*/

     $elem_reporter->append_child($elem_reporter_name);
/*שם את אלמנט המחרוזת בתוך
האלמנט של המדווח.
*/

     $elem_recommends->append_child($elem_reporter);
/*מוסיף את האלמנט של המדווח
לאלמנט השורש.
*/

  
     $elem_groupby=$xml_doc->create_element("GROUPBY");
/*יוצר את האלמנט שמכיל בתוכו את הקבוצות.*/

     $elem_groupby->set_attribute("key",$groupby);
/*מוסיף לאלמנט את המאפיין של מפתח הקיבוץ.*/

     foreach ($arr_group_books as $attr_val=>$group_books)
/*עובר על כל הקבוצות במערך שיצרנו, $arr_group_books,
ויוצרים את הקבוצות והספרים שבהם.
*/

     {
        $elem_group=$xml_doc->create_element("GROUP");
/*יוצר את האלמנט של קבוצה.*/

        $elem_group->set_attribute("value",$attr_val);
/*מוסיף לאלמנט את המאפיין של ערך הקבוצה.
כאן אנו לא מקדדים ל-UTF8,
כי הקידוד נעשה אוטומטית בתוך הפונקציה.
*/

        foreach ($group_books as $single_book)
/*משרשרים את כל האלמנטים של הספרים באותה הקבוצה.*/

        {
           $elem_group->append_child($single_book);
        }
        $elem_groupby->append_child($elem_group);
/*מוסיף את האלמנט של GROUP אל GROUPBY.*/

     }
     $elem_recommends->append_child($elem_groupby);
/*מוסיף את האלמנט של GROUPBY אל RECOMMENDS,
שהוא אלמנט השורש.
*/

  
     return $elem_recommends;
/*מחזיר את האובייקט של אלמנט השורש.*/

  }
?>

פונקציה ליצירת מסמך ה-XML השלם:

file name: books_xml_create_func.inc
<?php
  function XML_CreateRecommends($reporter
/*שם המדווח.*/
,$books
/*מערך של ספרים (לא כאובייקטים).
מערך של נתונים, כך שהמפתחות של המערך
הם האלמנטים של הספר.
*/
,$groupby="author"
/*מפתח הקיבוץ.*/
)
  {
     $groupby=strtoupper($groupby);
     $xml_doc=domxml_new_doc("1.0");
/*יצירת האובייקט הראשי של מסמך ה-XML.
חייב ליצור את כל האלמנטים שבמסמך מתוך אובייקט זה,
לכן אנו נעביר את האובייקט הזה אל הפונקציות לפי ייחוס.
*/

  
     $xml_books=array();
     foreach ($books as $book)
/*עוברים על מערך הספרים ויוצרים את
אובייקט האלמנט של כל ספר.
*/

        $xml_books[]
/*את אובייקט האלמנט שמתקבל,
שומרים במערך אלמנטים של הספרים.
*/
=XML_MakeBook($xml_doc
/*שולחים את האובייקט הראשי של מסמך ה-XML.*/
,$book
/*שולחים את המידע על הספר.*/
);
  
     $xml_recommends=XML_MakeRecommends($xml_doc,$reporter,$xml_books,$groupby);
/*יוצרים את האובייקט של אלמנט השורש.*/

     $xml_doc->append_child($xml_recommends);
/*מוסיפים את אלמנט השורש אל מסמך ה-XML.*/

  
     $xml_output=$xml_doc->dump_mem();
/*מחזיר את המחרוזת של המסמך בפורמט של XML.*/

  
   return $xml_output;
/*הפונקציה מחזירה את תוכן מסמך ה-XML.*/

  }
?>

היות והמודול של DOM-XML לא נטען עם PHP כברירת מחדל (למעשה, אינו מובנה בשפה, אינו built-in), יש צורך לבדוק האם המודול זמין לסקריפט ה-PHP. הפונקציה extension_loaded() בודקת האם מודול מסויים נטען למנוע ה-PHP. על-כן בראש הקובץ נשים את הקוד הבא, שבמקרה שהמודול לא זמין אז הסקריפט עוצר את הריצה:

file name: books_xml_create_func.inc (at the begining)
<?php
  if (!extension_loaded("domxml"))
/*אם המודול של DOM-XML לא נטען למנוע ה-PHP...*/

     exit("ERROR: DOMXML lib is not loaded !");
/*אז יוצאים מן התוכנית עם הודעת שגיאה מתאימה.*/

?>

על שרת Apache (ובהתאם לקונפיגרוציה של PHP: הכניסה enable_dl בקובץ ה-ini), ניתן להעלות את המודול בזמן הריצה של הסקריפט באמצעות הפונקציה dl(), ובתנאי שקובץ המודול (php_domxml.so) זמין.


תגובות בנושא

יצירת קובץ על השרת 06-12-03 10:01
 שגב
#916

אני מעוניין ליצור/להוסיף נתונים על השרת בצורה של קובץ XML שיישב על השרת. בvbscript יש פונקציה XMLDoc.save. איך עושים את זה כאן?


לדף הקודםתכנון קובץ ה-XML -הקודם
לתחילת הדףלתחילת הדף
הבא- ניתוח קובץ ה-XMLלדף הבא