[ Index ] |
|
Code source de XOOPS 2.0.17.1 |
1 <?php 2 // $Id: saxparser.php 2 2005-11-02 18:23:29Z skalpa $ 3 /******************************************************************************* 4 Location: <b>xml/SaxParser.class</b><br> 5 <br> 6 Provides basic functionality to read and parse XML documents. Subclasses 7 must implement all the their custom handlers by using add* function methods. 8 They may also use the handle*() methods to parse a specific XML begin and end 9 tags, but this is not recommended as it is more difficult.<br> 10 <br> 11 Copyright © 2001 eXtremePHP. All rights reserved.<br> 12 <br> 13 @author Ken Egervari<br> 14 *******************************************************************************/ 15 16 class SaxParser 17 { 18 var $level; 19 var $parser; 20 21 var $isCaseFolding; 22 var $targetEncoding; 23 24 /* Custom Handler Variables */ 25 var $tagHandlers = array(); 26 27 /* Tag stack */ 28 var $tags = array(); 29 30 /* Xml Source Input */ 31 var $xmlInput; 32 33 var $errors = array(); 34 35 /**************************************************************************** 36 Creates a SaxParser object using a FileInput to represent the stream 37 of XML data to parse. Use the static methods createFileInput or 38 createStringInput to construct xml input source objects to supply 39 to the constructor, or the implementor can construct them individually. 40 ****************************************************************************/ 41 function SaxParser(&$input) 42 { 43 $this->level = 0; 44 $this->parser = xml_parser_create('UTF-8'); 45 xml_set_object($this->parser, $this); 46 $this->input =& $input; 47 $this->setCaseFolding(false); 48 $this->useUtfEncoding(); 49 xml_set_element_handler($this->parser, 'handleBeginElement','handleEndElement'); 50 xml_set_character_data_handler($this->parser, 'handleCharacterData'); 51 xml_set_processing_instruction_handler($this->parser, 'handleProcessingInstruction'); 52 xml_set_default_handler($this->parser, 'handleDefault'); 53 xml_set_unparsed_entity_decl_handler($this->parser, 'handleUnparsedEntityDecl'); 54 xml_set_notation_decl_handler($this->parser, 'handleNotationDecl'); 55 xml_set_external_entity_ref_handler($this->parser, 'handleExternalEntityRef'); 56 } 57 58 /*--------------------------------------------------------------------------- 59 Property Methods 60 ---------------------------------------------------------------------------*/ 61 62 function getCurrentLevel() 63 { 64 return $this->level; 65 } 66 67 /**************************************************************************** 68 * @param $isCaseFolding 69 * @returns void 70 ****************************************************************************/ 71 function setCaseFolding($isCaseFolding) 72 { 73 assert(is_bool($isCaseFolding)); 74 75 $this->isCaseFolding = $isCaseFolding; 76 xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, $this->isCaseFolding); 77 } 78 79 /**************************************************************************** 80 * @returns void 81 ****************************************************************************/ 82 function useIsoEncoding() 83 { 84 $this->targetEncoding = 'ISO-8859-1'; 85 xml_parser_set_option($this->parser, XML_OPTION_TARGET_ENCODING, $this->targetEncoding); 86 } 87 88 /**************************************************************************** 89 * @returns void 90 ****************************************************************************/ 91 function useAsciiEncoding() 92 { 93 $this->targetEncoding = 'US-ASCII'; 94 xml_parser_set_option($this->parser, XML_OPTION_TARGET_ENCODING, $this->targetEncoding); 95 } 96 97 /**************************************************************************** 98 * @returns void 99 ****************************************************************************/ 100 function useUtfEncoding() 101 { 102 $this->targetEncoding = 'UTF-8'; 103 xml_parser_set_option($this->parser, XML_OPTION_TARGET_ENCODING, $this->targetEncoding); 104 } 105 106 /**************************************************************************** 107 Returns the name of the xml tag being parsed 108 * @returns string 109 ****************************************************************************/ 110 function getCurrentTag() 111 { 112 return $this->tags[count($this->tags) - 1]; 113 } 114 115 function getParentTag() 116 { 117 if (isset($this->tags[count($this->tags) - 2])) { 118 return $this->tags[count($this->tags) - 2]; 119 } 120 return false; 121 } 122 123 124 125 /*--------------------------------------------------------------------------- 126 Parser methods 127 ---------------------------------------------------------------------------*/ 128 129 /**************************************************************************** 130 * @returns void 131 ****************************************************************************/ 132 function parse() 133 { 134 if (!is_resource($this->input)) { 135 if (!xml_parse($this->parser, $this->input)) { 136 $this->setErrors($this->getXmlError()); 137 return false; 138 } 139 //if (!$fp = fopen($this->input, 'r')) { 140 // $this->setErrors('Could not open file: '.$this->input); 141 // return false; 142 //} 143 } else { 144 while ($data = fread($this->input, 4096)) { 145 if (!xml_parse($this->parser, str_replace("'", "'", $data), feof($this->input))) { 146 $this->setErrors($this->getXmlError()); 147 fclose($this->input); 148 return false; 149 } 150 } 151 fclose($this->input); 152 } 153 return true; 154 } 155 156 /**************************************************************************** 157 * @returns void 158 ****************************************************************************/ 159 function free() 160 { 161 xml_parser_free($this->parser); 162 163 if (!method_exists($this, '__destruct')) { 164 unset($this); 165 } 166 else { 167 $this->__destruct(); 168 } 169 } 170 171 /**************************************************************************** 172 * @private 173 * @returns string 174 ****************************************************************************/ 175 function getXmlError() 176 { 177 return sprintf("XmlParse error: %s at line %d", xml_error_string(xml_get_error_code($this->parser)), xml_get_current_line_number($this->parser)); 178 } 179 180 /*--------------------------------------------------------------------------- 181 Custom Handler Methods 182 ---------------------------------------------------------------------------*/ 183 184 /**************************************************************************** 185 Adds a callback function to be called when a tag is encountered.<br> 186 Functions that are added must be of the form:<br> 187 <b>functionName( $attributes )</b> 188 * @param $tagName string. The name of the tag currently being parsed. 189 * @param $functionName string. The name of the function in XmlDocument's 190 subclass. 191 * @returns void 192 ****************************************************************************/ 193 function addTagHandler(&$tagHandler) 194 { 195 $name = $tagHandler->getName(); 196 if (is_array($name)) { 197 foreach ($name as $n) { 198 $this->tagHandlers[$n] =& $tagHandler; 199 } 200 } else { 201 $this->tagHandlers[$name] =& $tagHandler; 202 } 203 } 204 205 206 /*--------------------------------------------------------------------------- 207 Private Handler Methods 208 ---------------------------------------------------------------------------*/ 209 210 /**************************************************************************** 211 Callback function that executes whenever a the start of a tag 212 occurs when being parsed. 213 * @param $parser int. The handle to the parser. 214 * @param $tagName string. The name of the tag currently being parsed. 215 * @param $attributesArray attay. The list of attributes associated with 216 the tag. 217 * @private 218 * @returns void 219 ****************************************************************************/ 220 function handleBeginElement($parser, $tagName, $attributesArray) 221 { 222 array_push($this->tags, $tagName); 223 $this->level++; 224 if (isset($this->tagHandlers[$tagName]) && is_subclass_of($this->tagHandlers[$tagName], 'xmltaghandler')) { 225 $this->tagHandlers[$tagName]->handleBeginElement($this, $attributesArray); 226 } else { 227 $this->handleBeginElementDefault($parser, $tagName, $attributesArray); 228 } 229 } 230 231 /**************************************************************************** 232 Callback function that executes whenever the end of a tag 233 occurs when being parsed. 234 * @param $parser int. The handle to the parser. 235 * @param $tagName string. The name of the tag currently being parsed. 236 * @private 237 * @returns void 238 ****************************************************************************/ 239 function handleEndElement($parser, $tagName) 240 { 241 array_pop($this->tags); 242 if (isset($this->tagHandlers[$tagName]) && is_subclass_of($this->tagHandlers[$tagName], 'xmltaghandler')) { 243 $this->tagHandlers[$tagName]->handleEndElement($this); 244 } else { 245 $this->handleEndElementDefault($parser, $tagName); 246 } 247 $this->level--; 248 } 249 250 /**************************************************************************** 251 Callback function that executes whenever character data is encountered 252 while being parsed. 253 * @param $parser int. The handle to the parser. 254 * @param $data string. Character data inside the tag 255 * @returns void 256 ****************************************************************************/ 257 function handleCharacterData($parser, $data) 258 { 259 $tagHandler =& $this->tagHandlers[$this->getCurrentTag()]; 260 if (isset($tagHandler) && is_subclass_of($tagHandler, 'xmltaghandler')) { 261 $tagHandler->handleCharacterData($this, $data); 262 } else { 263 $this->handleCharacterDataDefault($parser, $data); 264 } 265 } 266 267 /**************************************************************************** 268 * @param $parser int. The handle to the parser. 269 * @returns void 270 ****************************************************************************/ 271 function handleProcessingInstruction($parser, &$target, &$data) 272 { 273 // if($target == 'php') { 274 // eval($data); 275 // } 276 } 277 278 /**************************************************************************** 279 * @param $parser int. The handle to the parser. 280 * @returns void 281 ****************************************************************************/ 282 function handleDefault($parser, $data) 283 { 284 285 } 286 287 /**************************************************************************** 288 * @param $parser int. The handle to the parser. 289 * @returns void 290 ****************************************************************************/ 291 function handleUnparsedEntityDecl($parser, $entityName, $base, $systemId, $publicId, $notationName) 292 { 293 294 } 295 296 /**************************************************************************** 297 * @param $parser int. The handle to the parser. 298 * @returns void 299 ****************************************************************************/ 300 function handleNotationDecl($parser, $notationName, $base, $systemId, $publicId) 301 { 302 303 } 304 305 /**************************************************************************** 306 * @param $parser int. The handle to the parser. 307 * @returns void 308 ****************************************************************************/ 309 function handleExternalEntityRef($parser, $openEntityNames, $base, $systemId, $publicId) 310 { 311 312 } 313 314 /** 315 * The default tag handler method for a tag with no handler 316 * 317 * @abstract 318 */ 319 function handleBeginElementDefault($parser, $tagName, $attributesArray) 320 { 321 } 322 323 /** 324 * The default tag handler method for a tag with no handler 325 * 326 * @abstract 327 */ 328 function handleEndElementDefault($parser, $tagName) 329 { 330 } 331 332 /** 333 * The default tag handler method for a tag with no handler 334 * 335 * @abstract 336 */ 337 function handleCharacterDataDefault($parser, $data) 338 { 339 } 340 341 /** 342 * Sets error messages 343 * 344 * @param $error string an error message 345 */ 346 function setErrors($error) 347 { 348 $this->errors[] = trim($error); 349 } 350 351 /** 352 * Gets all the error messages 353 * 354 * @param $ashtml bool return as html? 355 * @return mixed 356 */ 357 function &getErrors($ashtml = true) 358 { 359 if (!$ashtml) { 360 return $this->errors; 361 } else { 362 $ret = ''; 363 if (count($this->errors) > 0) { 364 foreach ($this->errors as $error) { 365 $ret .= $error.'<br />'; 366 } 367 } 368 return $ret; 369 } 370 } 371 } 372 373 ?>
titre
Description
Corps
titre
Description
Corps
titre
Description
Corps
titre
Corps
Généré le : Sun Nov 25 11:44:32 2007 | par Balluche grâce à PHPXref 0.7 |
![]() |