<?php
class XmlNode
{
var $name;
var $attrs;
var $parent;
var $nextSibling;
var $previousSibling;
var $children;
var $lastChild;
var $firstChild;
var $text;
function XmlNode()
{
$this->children = array();
}
function &addNewChildNode()
{
return $this->addChildNode(new XmlNode);
}
function getAttributeTree($attribute)
{
$nodes=array();
$nodes[]=$this->attrs[$attribute];
$child =& $this->firstChild;
while (!is_null($child))
{
$nodes[]=$child->getAttributeTree($attribute);
$child =& $child->nextSibling;
}
return $nodes;
}
function setAttributeTree($attribute, $nodes)
{
$this->attrs[$attribute]=$nodes[0];
$teller=0;
while (++$teller<count($nodes))
{
$this->children[$teller-1]->setAttributeTree($attribute, $nodes[$teller]);
}
}
function &addChildNode(&$node)
{
$this -> children[] =& $node;
$node->parent =& $this;
if ($this->countChildren()>1)
{
$this->lastChild->nextSibling =& $node;
$node->previousSibling =& $this->lastChild;
}
else $this->firstChild =& $node;
$this->lastChild =& $node;
return $node;
}
function countChildren()
{
return count($this->children);
}
function hasChildren()
{
return count($this->children)>0;
}
function hasParent()
{
return !is_null($this->parent);
}
function toTree($niveau,$beforeGroup,$beforeItem,$afterItem,$afterGroup)
{
$tree = $beforeItem.$this->name;
foreach ($this->attrs as $a => $v) $tree.='('.$a.'='.$v.')';
if (!is_null($this->text)) $tree.= " -".$this->text."-";
$tree.=$afterItem."\n";
if ($this->hasChildren())
{
$tree.=$beforeGroup;
foreach ($this->children as $child) $tree.=$child->toTree($niveau+1,$beforeGroup,$beforeItem,$afterItem,$afterGroup);
$tree.=$afterGroup;
}
while ($niveau-->0) $tree=' '.$tree;
return $tree;
}
function toHtmlTree()
{
return "<UL>".$this->toTree(-999,"<UL>","<LI>","</LI>","</UL>")."</UL>";
}
function toXml($niveau)
{
$xml.= '<'.strtolower($this->name);
foreach ($this->attrs as $a => $v) $xml.=' '.strtolower($a).'="'.$v.'"';
$xml.= ">";
if ($this->hasChildren())
{
$xml.="\n";
foreach ($this->children as $child) $xml.=$child->toXml($niveau+1);
while ($niveau-->0) $xml=' '.$xml.' ';
}
else
{
while ($niveau-->0) $xml=' '.$xml;
$xml.=$this->text;
}
if ($niveau==0) $xml="<?xml version='1.0' ?>\n".$xml;
return $xml.'</'.strtolower($this->name).">\n";
}
function &findFirstChild($name)
{
$i = -1;
while (is_null($node) && ++$i<$this->countChildren())
if (strtolower($this->children[$i]->name)==strtolower($name)) $node =& $this->children[$i];
return $node;
}
function &findNextSibling($name)
{
$next =& $this->nextSibling;
while (is_null($node) && !is_null($next))
{
if (strtolower($next->name)==strtolower($name)) $node=& $next;
$next =& $next->nextSibling;
}
return $node;
}
function &findChildren($name)
{
$children = array();
$i = -1;
while (++$i<$this->countChildren())
if (strtolower($this->children[$i]->name)==strtolower($name)) $children[] =& $this->children[$i];
return $children;
}
}
function XmlStartElement($parser, $name, $attrs)
{
global $XmlRootNode;
global $XmlParentId;
$XmlRootNode[] = new XmlNode;
$node =& $XmlRootNode[count($XmlRootNode)-1];
if ($XmlParentId>=0) $node->parentId = $XmlParentId;
$node->name = $name;
$node->attrs = $attrs;
$XmlParentId = count($XmlRootNode)-1;
}
function XmlCharacterData($parser, $text)
{
global $XmlRootNode;
global $XmlParentId;
$text=trim(trim(trim($text,"\t"),"\n"));
if (strlen($text)>0) $XmlRootNode[$XmlParentId]->text=$text;
}
function XmlEndElement($parser, $name)
{
global $XmlRootNode;
global $XmlParentId;
$XmlParentId = $XmlRootNode[$XmlParentId]->parentId;
}
function &XmlReadFile($file)
{
global $XmlRootNode,$Xml_parser;
$XmlRootNode = array();
$Xml_parser = Xml_parser_create();
Xml_set_element_handler($Xml_parser, "XmlStartElement", "XmlEndElement");
Xml_set_character_data_handler($Xml_parser, "XmlCharacterData");
if (!($fp = fopen($file, "r"))) die("could not open Xml input");
while ($data = fread($fp, 4096)) if (!Xml_parse($Xml_parser, $data, feof($fp)))
die(sprintf("Xml error: %s at line %d", Xml_error_string(Xml_get_error_code($Xml_parser)), Xml_get_current_line_number($Xml_parser)));
Xml_parser_free($Xml_parser);
$teller=0;while (++$teller<count($XmlRootNode)) $XmlRootNode[$XmlRootNode[$teller]->parentId]->addChildNode($XmlRootNode[$teller]);
return $XmlRootNode[0];
}
?>
|