note 82274 deleted from ref.xmlreader by nlopess
| From: | nlopess@php.net | 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 );
}
?>