MediaWiki
master
|
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 }