tree.php

来自「视频监控网络部分的协议ddns,的模块的实现代码,请大家大胆指正.」· PHP 代码 · 共 371 行

PHP
371
字号
<?php//// +----------------------------------------------------------------------+// | PHP Version 4                                                        |// +----------------------------------------------------------------------+// | Copyright (c) 1997-2002 The PHP Group                                |// +----------------------------------------------------------------------+// | This source file is subject to version 2.02 of the PHP license,      |// | that is bundled with this package in the file LICENSE, and is        |// | available at through the world-wide-web at                           |// | http://www.php.net/license/2_02.txt.                                 |// | If you did not receive a copy of the PHP license and are unable to   |// | obtain it through the world-wide-web, please send a note to          |// | license@php.net so we can mail you a copy immediately.               |// +----------------------------------------------------------------------+// | Authors: Bernd R鰉er <berndr@bonn.edu>                               |// |          Sebastian Bergmann <sb@sebastian-bergmann.de>               |// |          Tomas V.V.Cox <cox@idecnet.com> (tree mapping from xml file)|// +----------------------------------------------------------------------+//// $Id: Tree.php,v 1.19 2002/05/17 12:15:23 cox Exp $//require_once 'XML/Parser.php';require_once 'XML/Tree/Node.php';/*** PEAR::XML_Tree** Purpose**    Allows for the building of XML data structures*    using a tree representation, without the need*    for an extension like DOMXML.** Example**    $tree  = new XML_Tree;*    $root =& $tree->addRoot('root');*    $foo  =& $root->addChild('foo');**    header('Content-Type: text/xml');*    $tree->dump();** @author  Bernd R鰉er <berndr@bonn.edu>* @package XML* @version $Version$ - 1.0*/class XML_Tree extends XML_Parser{    /**    * File Handle    *    * @var  ressource    */    var $file = NULL;    /**    * Filename    *    * @var  string    */    var $filename = '';    /**    * Namespace    *    * @var  array    */    var $namespace = array();    /**    * Root    *    * @var  object XML_Tree_Node    */    var $root = NULL;    /**    * XML Version    *    * @var  string    */    var $version = '1.0';    /**    * Constructor    *    * @param  string  Filename    * @param  string  XML Version    */    function XML_Tree($filename = '', $version = '1.0') {        $this->filename = $filename;        $this->version  = $version;    }    /**    * Add root node.    *    * @param  string  $name     name of root element    * @return object XML_Tree_Node   reference to root node    *    * @access public    */    function &addRoot($name, $content = '', $attributes = array()) {        $this->root = new XML_Tree_Node($name, $content, $attributes);        return $this->root;    }    /**    * @deprecated    */    function &add_root($name, $content = '', $attributes = array()) {        return $this->addRoot($name, $content, $attributes);    }    /**    * inserts a child/tree (child) into tree ($path,$pos) and    * maintains namespace integrity    *    * @param array      $path           path to parent of child to remove    * @param integer    $pos            position of child to be inserted in its parents children-list    * @param mixed      $child          child-node (by XML_Tree,XML_Node or Name)    * @param string     $content        content (text) for new node    * @param array      $attributes     attribute-hash for new node    *    * @return object XML_Tree_Node inserted child (node)    * @access public    */    function &insertChild($path,$pos,$child, $content = '', $attributes = array()) {        // update namespace to maintain namespace integrity        $count=count($path);        foreach($this->namespace as $key => $val) {            if ((array_slice($val,0,$count)==$path) && ($val[$count]>=$pos))                $this->namespace[$key][$count]++;        }        $parent=&$this->get_node_by_path($path);        return($parent->insert_child($pos,$child,$content,$attributes));    }    /**    * @deprecated    */    function &insert_child($path,$pos,$child, $content = '', $attributes = array()) {        return $this->insertChild($path, $child, $content, $attributes);    }    /*    * removes a child ($path,$pos) from tree ($path,$pos) and    * maintains namespace integrity    *    * @param array      $path   path to parent of child to remove    * @param integer    $pos    position of child in parents children-list    *    * @return object XML_Tree_Node parent whichs child was removed    * @access public    */    function &removeChild($path,$pos) {        // update namespace to maintain namespace integrity        $count=count($path);        foreach($this->namespace as $key => $val) {            if (array_slice($val,0,$count)==$path) {                if ($val[$count]==$pos) { unset($this->namespace[$key]); break; }                if ($val[$count]>$pos)                    $this->namespace[$key][$count]--;            }        }        $parent=&$this->get_node_by_path($path);        return($parent->remove_child($pos));    }    /**    * @deprecated    */    function &remove_child($path, $pos) {        return $this->removeChild($path, $pos);    }    /*    * Maps a xml file to a objects tree    *    * @return mixed The objects tree (XML_tree or an Pear error)    * @access public    */    function &getTreeFromFile ()    {        $this->folding = false;        $this->XML_Parser(null, 'event');        $err = $this->setInputFile($this->filename);        if (PEAR::isError($err)) {            return $err;        }        $this->cdata = null;        $err = $this->parse();        if (PEAR::isError($err)) {            return $err;        }        return $this->root;    }    function getTreeFromString($str)    {        $this->folding = false;        $this->XML_Parser(null, 'event');        $this->cdata = null;        $err = $this->parseString($str);        if (PEAR::isError($err)) {            return $err;        }        return $this->root;    }    /**    * Handler for the xml-data    *    * @param mixed  $xp         ignored    * @param string $elem       name of the element    * @param array  $attribs    attributes for the generated node    *    * @access private    */    function startHandler($xp, $elem, &$attribs)    {        // root elem        if (!isset($this->i)) {            $this->obj1 =& $this->add_root($elem, null, $attribs);            $this->i = 2;        } else {            // mixed contents            if (!empty($this->cdata)) {                $parent_id = 'obj' . ($this->i - 1);                $parent    =& $this->$parent_id;                $parent->children[] = &new XML_Tree_Node(null, $this->cdata);            }            $obj_id = 'obj' . $this->i++;            $this->$obj_id = &new XML_Tree_Node($elem, null, $attribs);        }        $this->cdata = null;        return null;    }    /**    * Handler for the xml-data    *    * @param mixed  $xp         ignored    * @param string $elem       name of the element    *    * @access private    */    function endHandler($xp, $elem)    {        $this->i--;        if ($this->i > 1) {            $obj_id = 'obj' . $this->i;            // recover the node created in StartHandler            $node   =& $this->$obj_id;            // mixed contents            if (count($node->children) > 0) {                if (trim($this->cdata)) {                    $node->children[] = &new XML_Tree_Node(null, $this->cdata);                }            } else {                $node->set_content($this->cdata);            }            $parent_id = 'obj' . ($this->i - 1);            $parent    =& $this->$parent_id;            // attach the node to its parent node children array            $parent->children[] = $node;        }        $this->cdata = null;        return null;    }    /*    * The xml character data handler    *    * @param mixed  $xp         ignored    * @param string $data       PCDATA between tags    *    * @access private    */    function cdataHandler($xp, $data)    {        if (trim($data)) {            $this->cdata .= $data;        }    }    /**    * Get a copy of this tree.    *    * @return object XML_Tree    * @access public    */    function clone() {        $clone=new XML_Tree($this->filename,$this->version);        $clone->root=$this->root->clone();        // clone all other vars        $temp=get_object_vars($this);        foreach($temp as $varname => $value)            if (!in_array($varname,array('filename','version','root')))                $clone->$varname=$value;        return($clone);    }    /**    * Print text representation of XML tree.    *    * @access public    */    function dump() {        echo $this->get();    }    /**    * Get text representation of XML tree.    *    * @return  string  XML    * @access public    */    function &get() {        $out = '<?xml version="' . $this->version . "\"?>\n";        $out .= $this->root->get();        return $out;    }    /**    * Get current namespace.    *    * @param  string  $name namespace    * @return string    *    * @access public    */    function &getName($name) {        return $this->root->get_element($this->namespace[$name]);    }    /**    * @deprecated    */    function &get_name($name) {        return $this->getName($name);    }    /**    * Register a namespace.    *    * @param  string  $name namespace    * @param  string  $path path    *    * @access public    */    function registerName($name, $path) {        $this->namespace[$name] = $path;    }    /**    * @deprecated    */    function register_name($name, $path) {        return $this->registerName($name, $path);    }}?>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?