note 82275 added to ref.xmlreader
| From: | alexei dot adadurov at mail dot ru | Date: | Thu, 03 Apr 2008 16:07:19 +0000 |
| Subject: | note 82275 added to ref.xmlreader | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-137897@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/82275
Del: integrated -- https://master.php.net/note/delete/82275/integrated
Del: useless -- https://master.php.net/note/delete/82275/useless
Del: bad code -- https://master.php.net/note/delete/82275/bad+code
Del: spam -- https://master.php.net/note/delete/82275/spam
Del: non-english -- https://master.php.net/note/delete/82275/non-english
Del: in docs -- https://master.php.net/note/delete/82275/in+docs
Del: other reasons-- https://master.php.net/note/delete/82275
Reject -- https://master.php.net/note/reject/82275
Search -- https://master.php.net/manage/user-notes.php