Blame | Letzte Änderung | Log anzeigen | RSS feed
<?php/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: *//*** XML_Parser** XML Parser's Simple parser class** PHP versions 4 and 5** LICENSE:** Copyright (c) 2002-2008 The PHP Group* All rights reserved.** Redistribution and use in source and binary forms, with or without* modification, are permitted provided that the following conditions* are met:** * Redistributions of source code must retain the above copyright* notice, this list of conditions and the following disclaimer.* * Redistributions in binary form must reproduce the above copyright* notice, this list of conditions and the following disclaimer in the* documentation and/or other materials provided with the distribution.* * The name of the author may not be used to endorse or promote products* derived from this software without specific prior written permission.** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.** @category XML* @package XML_Parser* @author Stephan Schmidt <schst@php.net>* @copyright 2004-2008 Stephan Schmidt <schst@php.net>* @license http://opensource.org/licenses/bsd-license New BSD License* @version CVS: $Id: Simple.php 265444 2008-08-24 21:48:21Z ashnazg $* @link http://pear.php.net/package/XML_Parser*//*** built on XML_Parser*/require_once 'XML/Parser.php';/*** Simple XML parser class.** This class is a simplified version of XML_Parser.* In most XML applications the real action is executed,* when a closing tag is found.** XML_Parser_Simple allows you to just implement one callback* for each tag that will receive the tag with its attributes* and CData.** <code>* require_once '../Parser/Simple.php';** class myParser extends XML_Parser_Simple* {* function myParser()* {* $this->XML_Parser_Simple();* }** function handleElement($name, $attribs, $data)* {* printf('handle %s<br>', $name);* }* }** $p = &new myParser();** $result = $p->setInputFile('myDoc.xml');* $result = $p->parse();* </code>** @category XML* @package XML_Parser* @author Stephan Schmidt <schst@php.net>* @copyright 2004-2008 The PHP Group* @license http://opensource.org/licenses/bsd-license New BSD License* @version Release: @package_version@* @link http://pear.php.net/package/XML_Parser*/class XML_Parser_Simple extends XML_Parser{/*** element stack** @access private* @var array*/var $_elStack = array();/*** all character data** @access private* @var array*/var $_data = array();/*** element depth** @access private* @var integer*/var $_depth = 0;/*** Mapping from expat handler function to class method.** @var array*/var $handler = array('default_handler' => 'defaultHandler','processing_instruction_handler' => 'piHandler','unparsed_entity_decl_handler' => 'unparsedHandler','notation_decl_handler' => 'notationHandler','external_entity_ref_handler' => 'entityrefHandler');/*** Creates an XML parser.** This is needed for PHP4 compatibility, it will* call the constructor, when a new instance is created.** @param string $srcenc source charset encoding, use NULL (default) to use* whatever the document specifies* @param string $mode how this parser object should work, "event" for* handleElement(), "func" to have it call functions* named after elements (handleElement_$name())* @param string $tgtenc a valid target encoding*/function XML_Parser_Simple($srcenc = null, $mode = 'event', $tgtenc = null){$this->XML_Parser($srcenc, $mode, $tgtenc);}/*** inits the handlers** @return mixed* @access private*/function _initHandlers(){if (!is_object($this->_handlerObj)) {$this->_handlerObj = &$this;}if ($this->mode != 'func' && $this->mode != 'event') {return $this->raiseError('Unsupported mode given',XML_PARSER_ERROR_UNSUPPORTED_MODE);}xml_set_object($this->parser, $this->_handlerObj);xml_set_element_handler($this->parser, array(&$this, 'startHandler'),array(&$this, 'endHandler'));xml_set_character_data_handler($this->parser, array(&$this, 'cdataHandler'));/*** set additional handlers for character data, entities, etc.*/foreach ($this->handler as $xml_func => $method) {if (method_exists($this->_handlerObj, $method)) {$xml_func = 'xml_set_' . $xml_func;$xml_func($this->parser, $method);}}}/*** Reset the parser.** This allows you to use one parser instance* to parse multiple XML documents.** @access public* @return boolean|object true on success, PEAR_Error otherwise*/function reset(){$this->_elStack = array();$this->_data = array();$this->_depth = 0;$result = $this->_create();if ($this->isError($result)) {return $result;}return true;}/*** start handler** Pushes attributes and tagname onto a stack** @param resource $xp xml parser resource* @param string $elem element name* @param array &$attribs attributes** @return mixed* @access private* @final*/function startHandler($xp, $elem, &$attribs){array_push($this->_elStack, array('name' => $elem,'attribs' => $attribs));$this->_depth++;$this->_data[$this->_depth] = '';}/*** end handler** Pulls attributes and tagname from a stack** @param resource $xp xml parser resource* @param string $elem element name** @return mixed* @access private* @final*/function endHandler($xp, $elem){$el = array_pop($this->_elStack);$data = $this->_data[$this->_depth];$this->_depth--;switch ($this->mode) {case 'event':$this->_handlerObj->handleElement($el['name'], $el['attribs'], $data);break;case 'func':$func = 'handleElement_' . $elem;if (strchr($func, '.')) {$func = str_replace('.', '_', $func);}if (method_exists($this->_handlerObj, $func)) {call_user_func(array(&$this->_handlerObj, $func),$el['name'], $el['attribs'], $data);}break;}}/*** handle character data** @param resource $xp xml parser resource* @param string $data data** @return void* @access private* @final*/function cdataHandler($xp, $data){$this->_data[$this->_depth] .= $data;}/*** handle a tag** Implement this in your parser** @param string $name element name* @param array $attribs attributes* @param string $data character data** @return void* @access public* @abstract*/function handleElement($name, $attribs, $data){}/*** get the current tag depth** The root tag is in depth 0.** @access public* @return integer*/function getCurrentDepth(){return $this->_depth;}/*** add some string to the current ddata.** This is commonly needed, when a document is parsed recursively.** @param string $data data to add** @return void* @access public*/function addToData($data){$this->_data[$this->_depth] .= $data;}}?>