<?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];
 
}
 
 
?>
 
 |