MediaWiki  master
XmlTypeCheck.php
Go to the documentation of this file.
00001 <?php
00023 class XmlTypeCheck {
00028         public $wellFormed = false;
00029 
00034         public $filterMatch = false;
00035 
00040         public $rootElement = '';
00041 
00050         function __construct( $file, $filterCallback=null ) {
00051                 $this->filterCallback = $filterCallback;
00052                 $this->run( $file );
00053         }
00054 
00060         public function getRootElement() {
00061                 return $this->rootElement;
00062         }
00063 
00067         private function run( $fname ) {
00068                 $parser = xml_parser_create_ns( 'UTF-8' );
00069 
00070                 // case folding violates XML standard, turn it off
00071                 xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, false );
00072 
00073                 xml_set_element_handler( $parser, array( $this, 'rootElementOpen' ), false );
00074 
00075                 if ( file_exists( $fname ) ) {
00076                         $file = fopen( $fname, "rb" );
00077                         if ( $file ) {
00078                                 do {
00079                                         $chunk = fread( $file, 32768 );
00080                                         $ret = xml_parse( $parser, $chunk, feof( $file ) );
00081                                         if( $ret == 0 ) {
00082                                                 // XML isn't well-formed!
00083                                                 fclose( $file );
00084                                                 xml_parser_free( $parser );
00085                                                 return;
00086                                         }
00087                                 } while( !feof( $file ) );
00088 
00089                                 fclose( $file );
00090                         }
00091                 }
00092 
00093                 $this->wellFormed = true;
00094 
00095                 xml_parser_free( $parser );
00096         }
00097 
00103         private function rootElementOpen( $parser, $name, $attribs ) {
00104                 $this->rootElement = $name;
00105 
00106                 if( is_callable( $this->filterCallback ) ) {
00107                         xml_set_element_handler( $parser, array( $this, 'elementOpen' ), false );
00108                         $this->elementOpen( $parser, $name, $attribs );
00109                 } else {
00110                         // We only need the first open element
00111                         xml_set_element_handler( $parser, false, false );
00112                 }
00113         }
00114 
00120         private function elementOpen( $parser, $name, $attribs ) {
00121                 if( call_user_func( $this->filterCallback, $name, $attribs ) ) {
00122                         // Filter hit!
00123                         $this->filterMatch = true;
00124                 }
00125         }
00126 }