📄 parser.php
字号:
/** * 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() { $result = $this->_create(); if ($this->isError( $result )) { return $result; } return true; } // }}} // {{{ setInputFile() /** * Sets the input xml file to be parsed * * @param string Filename (full path) * @return resource fopen handle of the given file * @throws XML_Parser_Error * @see setInput(), setInputString(), parse() * @access public */ function setInputFile($file) { /** * check, if file is a remote file */ if (eregi('^(http|ftp)://', substr($file, 0, 10))) { if (!ini_get('allow_url_fopen')) { return $this->raiseError('Remote files cannot be parsed, as safe mode is enabled.', XML_PARSER_ERROR_REMOTE); } } $fp = @fopen($file, 'rb'); if (is_resource($fp)) { $this->fp = $fp; return $fp; } return $this->raiseError('File could not be opened.', XML_PARSER_ERROR_FILE_NOT_READABLE); } // }}} // {{{ setInputString() /** * XML_Parser::setInputString() * * Sets the xml input from a string * * @param string $data a string containing the XML document * @return null **/ function setInputString($data) { $this->fp = $data; return null; } // }}} // {{{ setInput() /** * Sets the file handle to use with parse(). * * You should use setInputFile() or setInputString() if you * pass a string * * @param mixed $fp Can be either a resource returned from fopen(), * a URL, a local filename or a string. * @access public * @see parse() * @uses setInputString(), setInputFile() */ function setInput($fp) { if (is_resource($fp)) { $this->fp = $fp; return true; } // see if it's an absolute URL (has a scheme at the beginning) elseif (eregi('^[a-z]+://', substr($fp, 0, 10))) { return $this->setInputFile($fp); } // see if it's a local file elseif (file_exists($fp)) { return $this->setInputFile($fp); } // it must be a string else { $this->fp = $fp; return true; } return $this->raiseError('Illegal input format', XML_PARSER_ERROR_INVALID_INPUT); } // }}} // {{{ parse() /** * Central parsing function. * * @return true|object PEAR error returns true on success, or a PEAR_Error otherwise * @access public */ function parse() { /** * reset the parser */ $result = $this->reset(); if ($this->isError($result)) { return $result; } // if $this->fp was fopened previously if (is_resource($this->fp)) { while ($data = fread($this->fp, 4096)) { if (!$this->_parseString($data, feof($this->fp))) { $error = &$this->raiseError(); $this->free(); return $error; } } // otherwise, $this->fp must be a string } else { if (!$this->_parseString($this->fp, true)) { $error = &$this->raiseError(); $this->free(); return $error; } } $this->free(); return true; } /** * XML_Parser::_parseString() * * @param string $data * @param boolean $eof * @return bool * @access private * @see parseString() **/ function _parseString($data, $eof = false) { return xml_parse($this->parser, $data, $eof); } // }}} // {{{ parseString() /** * XML_Parser::parseString() * * Parses a string. * * @param string $data XML data * @param boolean $eof If set and TRUE, data is the last piece of data sent in this parser * @throws XML_Parser_Error * @return Pear Error|true true on success or a PEAR Error * @see _parseString() */ function parseString($data, $eof = false) { if (!isset($this->parser) || !is_resource($this->parser)) { $this->reset(); } if (!$this->_parseString($data, $eof)) { $error = &$this->raiseError(); $this->free(); return $error; } if ($eof === true) { $this->free(); } return true; } /** * XML_Parser::free() * * Free the internal resources associated with the parser * * @return null **/ function free() { if (isset($this->parser) && is_resource($this->parser)) { xml_parser_free($this->parser); unset( $this->parser ); } if (isset($this->fp) && is_resource($this->fp)) { fclose($this->fp); } unset($this->fp); return null; } /** * XML_Parser::raiseError() * * Throws a XML_Parser_Error * * @param string $msg the error message * @param integer $ecode the error message code * @return XML_Parser_Error **/ function raiseError($msg = null, $ecode = 0) { $msg = !is_null($msg) ? $msg : $this->parser; $err = &new XML_Parser_Error($msg, $ecode); return parent::raiseError($err); } // }}} // {{{ funcStartHandler() function funcStartHandler($xp, $elem, $attribs) { $func = 'xmltag_' . $elem; if (strchr($func, '.')) { $func = str_replace('.', '_', $func); } if (method_exists($this->_handlerObj, $func)) { call_user_func(array(&$this->_handlerObj, $func), $xp, $elem, $attribs); } elseif (method_exists($this->_handlerObj, 'xmltag')) { call_user_func(array(&$this->_handlerObj, 'xmltag'), $xp, $elem, $attribs); } } // }}} // {{{ funcEndHandler() function funcEndHandler($xp, $elem) { $func = 'xmltag_' . $elem . '_'; if (strchr($func, '.')) { $func = str_replace('.', '_', $func); } if (method_exists($this->_handlerObj, $func)) { call_user_func(array(&$this->_handlerObj, $func), $xp, $elem); } elseif (method_exists($this->_handlerObj, 'xmltag_')) { call_user_func(array(&$this->_handlerObj, 'xmltag_'), $xp, $elem); } } // }}} // {{{ startHandler() /** * * @abstract */ function startHandler($xp, $elem, &$attribs) { return NULL; } // }}} // {{{ endHandler() /** * * @abstract */ function endHandler($xp, $elem) { return NULL; } // }}}me}/** * error class, replaces PEAR_Error * * An instance of this class will be returned * if an error occurs inside XML_Parser. * * There are three advantages over using the standard PEAR_Error: * - All messages will be prefixed * - check for XML_Parser error, using is_a( $error, 'XML_Parser_Error' ) * - messages can be generated from the xml_parser resource * * @package XML_Parser * @access public * @see PEAR_Error */class XML_Parser_Error extends PEAR_Error{ // {{{ properties /** * prefix for all messages * * @var string */ var $error_message_prefix = 'XML_Parser: '; // }}} // {{{ constructor() /** * construct a new error instance * * You may either pass a message or an xml_parser resource as first * parameter. If a resource has been passed, the last error that * happened will be retrieved and returned. * * @access public * @param string|resource message or parser resource * @param integer error code * @param integer error handling * @param integer error level */ function XML_Parser_Error($msgorparser = 'unknown error', $code = 0, $mode = PEAR_ERROR_RETURN, $level = E_USER_NOTICE) { if (is_resource($msgorparser)) { $code = xml_get_error_code($msgorparser); $msgorparser = sprintf('%s at XML input line %d:%d', xml_error_string($code), xml_get_current_line_number($msgorparser), xml_get_current_column_number($msgorparser)); } $this->PEAR_Error($msgorparser, $code, $mode, $level); } // }}}}?>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -