xml.php

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

PHP
251
字号
<?php// +----------------------------------------------------------------------+// | PHP Version 4                                                        |// +----------------------------------------------------------------------+// | Copyright (c) 1997-2003 The PHP Group                                |// +----------------------------------------------------------------------+// | This source file is subject to version 2.0 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.               |// +----------------------------------------------------------------------+// | Author: Bertrand Mansion <bmansion@mamasam.com>                      |// +----------------------------------------------------------------------+//// $Id: XML.php,v 1.12 2004/08/07 10:11:27 mansion Exp $require_once('XML/Parser.php');require_once('XML/Util.php');/*** Config parser for XML Files** @author      Bertrand Mansion <bmansion@mamasam.com>* @package     Config*/class Config_Container_XML extends XML_Parser{    /**    * Deep level used for indentation    *    * @var  int    * @access private    */    var $_deep = -1;    /**    * This class options:    * version (1.0) : XML version    * encoding (ISO-8859-1) : XML content encoding    * name      : like in phparray, name of your config global entity    * indent    : char used for indentation    * linebreak : char used for linebreak    * addDecl   : whether to add the xml declaration at beginning or not    * useAttr   : whether to use the attributes    * isFile    : whether the given content is a file or an XML string    * useCData  : whether to surround data with <![CDATA[...]]>    *    * @var  array    */    var $options = array('version'   => '1.0',                         'encoding'  => 'ISO-8859-1',                         'name'      => '',                         'indent'    => '  ',                         'linebreak' => "\n",                         'addDecl'   => true,                         'useAttr'   => true,                         'isFile'    => true,                         'useCData'  => false);    /**    * Container objects    *    * @var  array    */    var $containers = array();    /**    * Constructor    *    * @access public    * @param    string  $options    Options to be used by renderer    *                               version     : (1.0) XML version    *                               encoding    : (ISO-8859-1) XML content encoding    *                               name        : like in phparray, name of your config global entity    *                               indent      : char used for indentation    *                               linebreak   : char used for linebreak    *                               addDecl     : whether to add the xml declaration at beginning or not    *                               useAttr     : whether to use the attributes    *                               isFile      : whether the given content is a file or an XML string    */    function Config_Container_XML($options = array())    {        foreach ($options as $key => $value) {            $this->options[$key] = $value;        }    } // end constructor    /**    * Parses the data of the given configuration file    *    * @access public    * @param string $datasrc    path to the configuration file    * @param object $obj        reference to a config object    * @return mixed returns a PEAR_ERROR, if error occurs or true if ok    */    function &parseDatasrc($datasrc, &$obj)    {        $this->folding = false;        $this->cdata = null;        $this->XML_Parser($this->options['encoding'], 'event');        $this->containers[0] =& $obj->container;        if (is_string($datasrc)) {            if ($this->options['isFile']) {                $err = $this->setInputFile($datasrc);                if (PEAR::isError($err)) {                    return $err;                }                $err = $this->parse();            } else {                $err = $this->parseString($datasrc, true);            }        } else {           $this->setInput($datasrc);           $err = $this->parse();        }        if (PEAR::isError($err)) {            return $err;        }        return true;    } // end func parseDatasrc    /**    * 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)    {        $container =& new Config_Container('section', $elem, null, $attribs);        $this->containers[] =& $container;        return null;    } // end func startHandler    /**    * Handler for the xml-data    *    * @param mixed  $xp         ignored    * @param string $elem       name of the element    *    * @access private    */    function endHandler($xp, $elem)    {        $count = count($this->containers);        $container =& $this->containers[$count-1];        $currentSection =& $this->containers[$count-2];        if (count($container->children) == 0) {            $container->setType('directive');            $container->setContent(trim($this->cdata));        }        $currentSection->addItem($container);        array_pop($this->containers);        $this->cdata = null;        return null;    } // end func endHandler    /*    * The xml character data handler    *    * @param mixed  $xp         ignored    * @param string $data       PCDATA between tags    *    * @access private    */    function cdataHandler($xp, $cdata)    {        $this->cdata .= $cdata;    } //  end func cdataHandler    /**    * Returns a formatted string of the object    * @param    object  $obj    Container object to be output as string    * @access   public    * @return   string    */    function toString(&$obj)    {        $indent = '';        if (!$obj->isRoot()) {            // no indent for root            $this->_deep++;            $indent = str_repeat($this->options['indent'], $this->_deep);        } else {            // Initialize string with xml declaration            $string = '';            if ($this->options['addDecl']) {                $string .= XML_Util::getXMLDeclaration($this->options['version'], $this->options['encoding']);                $string .= $this->options['linebreak'];            }            if (!empty($this->options['name'])) {                $string .= '<'.$this->options['name'].'>'.$this->options['linebreak'];                $this->_deep++;                $indent = str_repeat($this->options['indent'], $this->_deep);            }        }        if (!isset($string)) {            $string = '';        }        switch ($obj->type) {            case 'directive':                $attributes = ($this->options['useAttr']) ? $obj->attributes : array();                $string .= $indent.XML_Util::createTag($obj->name, $attributes, $obj->content, null,                            ($this->options['useCData'] ? XML_UTIL_CDATA_SECTION : XML_UTIL_REPLACE_ENTITIES));                $string .= $this->options['linebreak'];                break;            case 'comment':                $string .= $indent.'<!-- '.$obj->content.' -->';                $string .= $this->options['linebreak'];                break;            case 'section':                if (!$obj->isRoot()) {                    $string = $indent.'<'.$obj->name;                    $string .= ($this->options['useAttr']) ? XML_Util::attributesToString($obj->attributes) : '';                }                if ($children = count($obj->children)) {                    if (!$obj->isRoot()) {                        $string .= '>'.$this->options['linebreak'];                    }                    for ($i = 0; $i < $children; $i++) {                        $string .= $this->toString($obj->getChild($i));                    }                }                if (!$obj->isRoot()) {                    if ($children) {                        $string .= $indent.'</'.$obj->name.'>'.$this->options['linebreak'];                    } else {                        $string .= '/>'.$this->options['linebreak'];                    }                } else {                    if (!empty($this->options['name'])) {                        $string .= '</'.$this->options['name'].'>'.$this->options['linebreak'];                    }                }                break;            default:                $string = '';        }        if (!$obj->isRoot()) {            $this->_deep--;        }        return $string;    } // end func toString} // end class Config_Container_XML?>

⌨️ 快捷键说明

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