00001 <?php
00002
00003 class XmlTypeCheck {
00008 public $wellFormed = false;
00009
00014 public $filterMatch = false;
00015
00020 public $rootElement = '';
00021
00030 function __construct( $file, $filterCallback=null ) {
00031 $this->filterCallback = $filterCallback;
00032 $this->run( $file );
00033 }
00034
00038 public function getRootElement() {
00039 return $this->rootElement;
00040 }
00041
00042 private function run( $fname ) {
00043 $parser = xml_parser_create_ns( 'UTF-8' );
00044
00045
00046 xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, false );
00047
00048 xml_set_element_handler( $parser, array( $this, 'rootElementOpen' ), false );
00049
00050 $file = fopen( $fname, "rb" );
00051 do {
00052 $chunk = fread( $file, 32768 );
00053 $ret = xml_parse( $parser, $chunk, feof( $file ) );
00054 if( $ret == 0 ) {
00055
00056 fclose( $file );
00057 xml_parser_free( $parser );
00058 return;
00059 }
00060 } while( !feof( $file ) );
00061
00062 $this->wellFormed = true;
00063
00064 fclose( $file );
00065 xml_parser_free( $parser );
00066 }
00067
00068 private function rootElementOpen( $parser, $name, $attribs ) {
00069 $this->rootElement = $name;
00070
00071 if( is_callable( $this->filterCallback ) ) {
00072 xml_set_element_handler( $parser, array( $this, 'elementOpen' ), false );
00073 $this->elementOpen( $parser, $name, $attribs );
00074 } else {
00075
00076 xml_set_element_handler( $parser, false, false );
00077 }
00078 }
00079
00080 private function elementOpen( $parser, $name, $attribs ) {
00081 if( call_user_func( $this->filterCallback, $name, $attribs ) ) {
00082
00083 $this->filterMatch = true;
00084 }
00085 }
00086 }