note 82274 added to ref.xmlreader

From: Date: Thu, 03 Apr 2008 16:05:27 +0000
Subject: note 82274 added to ref.xmlreader
Groups: php.notes 
Request: Send a blank email to php-notes+get-137896@lists.php.net to get a copy of this message
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 ); } ?> ---- Server IP: 195.54.192.44 Probable Submitter: 92.36.51.40 ---- Manual Page -- http://www.php.net/manual/en/ref.xmlreader.php Edit -- https://master.php.net/note/edit/82274 Del: integrated -- https://master.php.net/note/delete/82274/integrated Del: useless -- https://master.php.net/note/delete/82274/useless Del: bad code -- https://master.php.net/note/delete/82274/bad+code Del: spam -- https://master.php.net/note/delete/82274/spam Del: non-english -- https://master.php.net/note/delete/82274/non-english Del: in docs -- https://master.php.net/note/delete/82274/in+docs Del: other reasons-- https://master.php.net/note/delete/82274 Reject -- https://master.php.net/note/reject/82274 Search -- https://master.php.net/manage/user-notes.php

« previous php.notes (#137896) next »