note 82274 deleted from ref.xmlreader by nlopess

From: Date: Thu, 03 Apr 2008 17:09:52 +0000
Subject: note 82274 deleted from ref.xmlreader by nlopess
References: 1  Groups: php.notes 
Request: Send a blank email to php-notes+get-137904@lists.php.net to get a copy of this message
Note Submitter: alexei dot adadurov at mail dot ru ---- This is my solution for parsing XML file containing hierarchical menu of the web site that you can see below. Many thanks to Ariel Gonzalez for the implementation of DumpXmlReader() -- it was very helpful during debugging phase. // XML file containing the menu <?xml version="1.0" encoding="UTF-8"?> <menu> <!-- main page ======================================================== --> <menu_item title="Home" page="main.html" default="yes"> <!-- any value other than "yes" as well as no value at all means it's not the default page!!! --> </menu_item> <!-- news page ======================================================== --> <menu_item title="News" page="news.html"> </menu_item> <!-- company information ======================================================== --> <menu_item title="О компании" page="about_company.html"> <menu_item title="Who we are" page="who_we_are.html"> </menu_item> <menu_item title="Our customers" page="our_customers.html"> </menu_item> <menu_item title="Testimonials" page="testimonials.html"> </menu_item> </menu_item> <!-- few pages skipped ======================================================== --> <!-- Products page ======================================================== --> <menu_item title="Products" page="products.html"> </menu_item> <!-- Contacts page ======================================================== --> <menu_item title="Contacts" page="contacts.html"> </menu_item> </menu> // PHP code <?php class menuItem { function menuItem($newTitle, $newPage, $newFolder = "", $newDefault = false, array $newSubMenu = NULL) { $this->title = $newTitle; $this->page = $newPage; $this->folder = $newFolder; $this->default = $newDefault; if( NULL != $newSubMenu ) { $this->subMenu = $newSubMenu; } } var $title = ""; var $page = ""; var $default = false; var $folder = ""; var $subMenu = array(); } function parseMenuFile($menuXmlFileName) { $xml = new XMLReader(); $xml->open($menuXmlFileName); $menuRoot = new menuItem("", ""); parseXML($xml, $menuRoot); // for debugging DumpMenu($menuRoot->subMenu); return $menuRoot->subMenu; } function DumpMenu(array &$menuItems) { foreach( $menuItems as $key=>$value ) { echo( '<a href="index.php?page=' . $value->page . '">' . $value->title . '</a><br>' ); DumpMenu($value->subMenu); } } // $XmlNode -- XMLReader pointing to the beginning of the next node in the XML file // $baseMenuItem -- menu node whose sumbenu is to be filled with elements function parseXML(XMLReader $XmlNode, &$baseMenuItem) { do { do { do { if( ! $XmlNode->read() ) { return; } } while( ! ( ($XmlNode->nodeType == XMLReader::ELEMENT) || ($XmlNode->nodeType == XMLReader::END_ELEMENT) ) ); } while( $XmlNode->name != "menu_item" ); if( $XmlNode->nodeType == XMLReader::END_ELEMENT ) { return; } $page = (string)$XmlNode->getAttribute("page"); $title = (string)$XmlNode->getAttribute("title"); $folder = (string)$XmlNode->getAttribute("folder"); $default = false; if( "yes" == (string)$XmlNode->getAttribute("default") ) { $default = true; } // valid menu item must have at least title and reference // (url of the target content page) defined if( ("" == $page) || ("" == $title) ) { $title = "Error! No url or no title specified!"; } $newItem = new menuItem($title, $page, $folder, $default, NULL); $baseMenuItem->subMenu[] = $newItem; //Call the recursive method again. parseXML($XmlNode, $newItem); } while( true ); } ?>

« previous php.notes (#137904) next »