יצירת קובץ ה-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,
$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. איך עושים את זה כאן? |
|