warningString = $warningString; } } class ValidationError { /* Represents an error thrown by the validator */ var $line; var $column; var $offset; var $msg; } class ValidationResults { /* Represents the results from validating a page */ var $uri; var $status; var $errormsg; var $modified; var $server; var $size; var $encoding; var $doctype; var $warnings = array(); var $messages = array(); function ValidationResults($uri = '', $status = '') { $this->uri = $uri; $this->status = $status; } function setErrorMsg($msg) { /* Used when document can not be validated at all */ $this->errormsg = $msg; } function setModified($modified) { $this->modified = $modified; } function setServer($server) { $this->server = $server; } function setSize($size) { $this->size = $size; } function setEncoding($encoding) { $this->encoding = $encoding; } function setDoctype($doctype) { $this->doctype = $doctype; } function addWarning($warning) { $this->warnings[] = $warning; } function addMessage($message) { $this->messages[] = $message; } function isValid() { return $this->status == 'Valid'; } } class ValidationParser { var $parser; var $results; var $currentError; var $currentTag; var $tagContents; function ValidationParser() { $this->parser = xml_parser_create(); xml_set_object($this->parser, &$this); xml_set_element_handler($this->parser, 'tag_open', 'tag_close'); xml_set_character_data_handler($this->parser, 'cdata'); } function parse($xml) { $this->results = new ValidationResults; return xml_parse($this->parser, $xml); } function tag_open($parser, $tag, $attr) { $tag = strtolower($tag); $this->currentTag = $tag; if ($tag == 'error') { $this->currentError = new ValidationError; } } function tag_close($parser, $tag) { $tag = strtolower($tag); switch ($tag) { case 'error': $this->results->addMessage($this->currentError); break; /* Stuff in the section */ case 'uri': $this->results->uri = $this->tagContents; break; case 'modified': $this->results->setModified($this->tagContents); break; case 'server': $this->results->setServer($this->tagContents); break; case 'size': $this->results->setSize($this->tagContents); break; case 'encoding': $this->results->setEncoding($this->tagContents); break; case 'doctype': $this->results->setDoctype($this->tagContents); break; /* Warnings */ case 'warning': $this->results->addWarning(new ValidationWarning($this->tagContents)); break; /* Error Parts */ case 'line': case 'column': case 'offset': case 'msg': $this->currentError->$tag = $this->tagContents; break; /* Error */ case 'error': $this->results->addMessage($this->currentError); break; } } function cdata($parser, $data) { $this->tagContents = trim($data); } } ?>