xml.php.svn-base

来自「PHP 知识管理系统(基于树结构的知识管理系统), 英文原版的PHP源码。」· SVN-BASE 代码 · 共 648 行 · 第 1/2 页

SVN-BASE
648
字号
    /**     *    Accessor for attributes.     *    @return hash        All attributes.     *    @access protected     */    function _getAttributes() {        return $this->_attributes;    }}/** *    Accumulator for incoming method tag. Holds the *    incoming test structure information for *    later dispatch to the reporter. *    @package SimpleTest *    @subpackage UnitTester */class NestingMethodTag extends NestingXmlTag {    /**     *    Sets the basic test information except     *    the name.     *    @param hash $attributes   Name value pairs.     *    @access public     */    function NestingMethodTag($attributes) {        $this->NestingXmlTag($attributes);    }    /**     *    Signals the appropriate start event on the     *    listener.     *    @param SimpleReporter $listener    Target for events.     *    @access public     */    function paintStart(&$listener) {        $listener->paintMethodStart($this->getName());    }    /**     *    Signals the appropriate end event on the     *    listener.     *    @param SimpleReporter $listener    Target for events.     *    @access public     */    function paintEnd(&$listener) {        $listener->paintMethodEnd($this->getName());    }}/** *    Accumulator for incoming case tag. Holds the *    incoming test structure information for *    later dispatch to the reporter. *    @package SimpleTest *    @subpackage UnitTester */class NestingCaseTag extends NestingXmlTag {    /**     *    Sets the basic test information except     *    the name.     *    @param hash $attributes   Name value pairs.     *    @access public     */    function NestingCaseTag($attributes) {        $this->NestingXmlTag($attributes);    }    /**     *    Signals the appropriate start event on the     *    listener.     *    @param SimpleReporter $listener    Target for events.     *    @access public     */    function paintStart(&$listener) {        $listener->paintCaseStart($this->getName());    }    /**     *    Signals the appropriate end event on the     *    listener.     *    @param SimpleReporter $listener    Target for events.     *    @access public     */    function paintEnd(&$listener) {        $listener->paintCaseEnd($this->getName());    }}/** *    Accumulator for incoming group tag. Holds the *    incoming test structure information for *    later dispatch to the reporter. *    @package SimpleTest *    @subpackage UnitTester */class NestingGroupTag extends NestingXmlTag {    /**     *    Sets the basic test information except     *    the name.     *    @param hash $attributes   Name value pairs.     *    @access public     */    function NestingGroupTag($attributes) {        $this->NestingXmlTag($attributes);    }    /**     *    Signals the appropriate start event on the     *    listener.     *    @param SimpleReporter $listener    Target for events.     *    @access public     */    function paintStart(&$listener) {        $listener->paintGroupStart($this->getName(), $this->getSize());    }    /**     *    Signals the appropriate end event on the     *    listener.     *    @param SimpleReporter $listener    Target for events.     *    @access public     */    function paintEnd(&$listener) {        $listener->paintGroupEnd($this->getName());    }    /**     *    The size in the attributes.     *    @return integer     Value of size attribute or zero.     *    @access public     */    function getSize() {        $attributes = $this->_getAttributes();        if (isset($attributes['SIZE'])) {            return (integer)$attributes['SIZE'];        }        return 0;    }}/** *    Parser for importing the output of the XmlReporter. *    Dispatches that output to another reporter. *    @package SimpleTest *    @subpackage UnitTester */class SimpleTestXmlParser {    var $_listener;    var $_expat;    var $_tag_stack;    var $_in_content_tag;    var $_content;    var $_attributes;    /**     *    Loads a listener with the SimpleReporter     *    interface.     *    @param SimpleReporter $listener   Listener of tag events.     *    @access public     */    function SimpleTestXmlParser(&$listener) {        $this->_listener = &$listener;        $this->_expat = &$this->_createParser();        $this->_tag_stack = array();        $this->_in_content_tag = false;        $this->_content = '';        $this->_attributes = array();    }    /**     *    Parses a block of XML sending the results to     *    the listener.     *    @param string $chunk        Block of text to read.     *    @return boolean             True if valid XML.     *    @access public     */    function parse($chunk) {        if (! xml_parse($this->_expat, $chunk)) {            trigger_error('XML parse error with ' .                    xml_error_string(xml_get_error_code($this->_expat)));            return false;        }        return true;    }    /**     *    Sets up expat as the XML parser.     *    @return resource        Expat handle.     *    @access protected     */    function &_createParser() {        $expat = xml_parser_create();        xml_set_object($expat, $this);        xml_set_element_handler($expat, '_startElement', '_endElement');        xml_set_character_data_handler($expat, '_addContent');        xml_set_default_handler($expat, '_default');        return $expat;    }    /**     *    Opens a new test nesting level.     *    @return NestedXmlTag     The group, case or method tag     *                             to start.     *    @access private     */    function _pushNestingTag($nested) {        array_unshift($this->_tag_stack, $nested);    }    /**     *    Accessor for current test structure tag.     *    @return NestedXmlTag     The group, case or method tag     *                             being parsed.     *    @access private     */    function &_getCurrentNestingTag() {        return $this->_tag_stack[0];    }    /**     *    Ends a nesting tag.     *    @return NestedXmlTag     The group, case or method tag     *                             just finished.     *    @access private     */    function _popNestingTag() {        return array_shift($this->_tag_stack);    }    /**     *    Test if tag is a leaf node with only text content.     *    @param string $tag        XML tag name.     *    @return @boolean          True if leaf, false if nesting.     *    @private     */    function _isLeaf($tag) {        return in_array($tag, array(                'NAME', 'PASS', 'FAIL', 'EXCEPTION', 'SKIP', 'MESSAGE', 'FORMATTED', 'SIGNAL'));    }    /**     *    Handler for start of event element.     *    @param resource $expat     Parser handle.     *    @param string $tag         Element name.     *    @param hash $attributes    Name value pairs.     *                               Attributes without content     *                               are marked as true.     *    @access protected     */    function _startElement($expat, $tag, $attributes) {        $this->_attributes = $attributes;        if ($tag == 'GROUP') {            $this->_pushNestingTag(new NestingGroupTag($attributes));        } elseif ($tag == 'CASE') {            $this->_pushNestingTag(new NestingCaseTag($attributes));        } elseif ($tag == 'TEST') {            $this->_pushNestingTag(new NestingMethodTag($attributes));        } elseif ($this->_isLeaf($tag)) {            $this->_in_content_tag = true;            $this->_content = '';        }    }    /**     *    End of element event.     *    @param resource $expat     Parser handle.     *    @param string $tag         Element name.     *    @access protected     */    function _endElement($expat, $tag) {        $this->_in_content_tag = false;        if (in_array($tag, array('GROUP', 'CASE', 'TEST'))) {            $nesting_tag = $this->_popNestingTag();            $nesting_tag->paintEnd($this->_listener);        } elseif ($tag == 'NAME') {            $nesting_tag = &$this->_getCurrentNestingTag();            $nesting_tag->setName($this->_content);            $nesting_tag->paintStart($this->_listener);        } elseif ($tag == 'PASS') {            $this->_listener->paintPass($this->_content);        } elseif ($tag == 'FAIL') {            $this->_listener->paintFail($this->_content);        } elseif ($tag == 'EXCEPTION') {            $this->_listener->paintError($this->_content);        } elseif ($tag == 'SKIP') {            $this->_listener->paintSkip($this->_content);        } elseif ($tag == 'SIGNAL') {            $this->_listener->paintSignal(                    $this->_attributes['TYPE'],                    unserialize($this->_content));        } elseif ($tag == 'MESSAGE') {            $this->_listener->paintMessage($this->_content);        } elseif ($tag == 'FORMATTED') {            $this->_listener->paintFormattedMessage($this->_content);        }    }    /**     *    Content between start and end elements.     *    @param resource $expat     Parser handle.     *    @param string $text        Usually output messages.     *    @access protected     */    function _addContent($expat, $text) {        if ($this->_in_content_tag) {            $this->_content .= $text;        }        return true;    }    /**     *    XML and Doctype handler. Discards all such content.     *    @param resource $expat     Parser handle.     *    @param string $default     Text of default content.     *    @access protected     */    function _default($expat, $default) {    }}?>

⌨️ 快捷键说明

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