php XML parser class simple

Scripting Sharing

php XML parser class simple

Notapor fsans » 19 Abr 2008, 16:13

Parser XML en PHP muy util si quieres hacerlo por tu cuenta en lugar de usar la API de la casa (muy lenta hoy por hoy, v9)

  1. <?php
  2. class xmlParser {
  3.     /**
  4.      *@package: xmlParser class                                            
  5.      *@version: 1.0; Requires PHP 4.3.6 (might work with older versions, but hasn't been tested)
  6.      *@description: this class is suppossed to be extended. The class extending this class must have these methods:
  7.      *    @function: doneParse()
  8.      *    @description: This function is called when all the parsing is complete
  9.      *
  10.      *    @funtion: startElementHandler(String $tag_name, Array $atrribs)
  11.      *    @description: This function is called when the parser hits a starting tag
  12.      *
  13.      *    @function: endElementHandler(String $tag_name)
  14.      *    @description: This function is called when the parser hits a closing tag
  15.      *
  16.      *    @function: dataHandler($data)
  17.      *    @description: This function is called when the parser hits character data
  18.      *
  19.      *@decription: The class has the following class vars:
  20.      *    @var: $this->curr_tag
  21.      *    @description: a string representation of the current tag. It is ALWAYS in upper case
  22.      *
  23.      *    @var: $this->repeat
  24.      *    @description: look below
  25.      *
  26.      ****************************************************
  27.      *@extra-info: the php xml parser handler specail chars that are encoded with entites as a seperate data cell.
  28.      *We get around this by using a counter to determine if the xml parser is looking at the same cell. This parser automatically
  29.      *Keeps track of this with the $this->repeat var. $this->repeat == true when the cell is repeated, false when it isn't.
  30.      **/
  31.          
  32.     var $xml_data = 0//the xml data
  33.     var $tag_pos = -1//intertal tagPos counters
  34.     var $curr_tag//defines the current tag that the parser is parsing
  35.     var $ent_c = 0//the current entitie counter
  36.     var $prev_ent_c = 0//the previous entity counter
  37.     var $repeat//a boolean determining if the parser is looking at the same Node (which means it is parsering entities)
  38.     
  39.    function xmlParser() {
  40.        $this->parser = xml_parser_create();
  41.    }
  42.    
  43.    function _openFile($file) {           
  44.            $this->_parsePrepare()//sets all the xml parsing vars
  45.            if($this->xml_data = file_get_contents($file)) {
  46.                return true;
  47.            } else {
  48.                exit('Error reading file');
  49.            }
  50.    }
  51.    
  52.    function _parsePrepare() {
  53.        $this->stack = array()// this keeps track of what tag level you're at
  54.        xml_set_object($this->parser$this);
  55.        xml_set_element_handler($this->parser"_startElementHandler""_endElementHandler");
  56.        xml_set_character_data_handler($this->parser"_dataHandler");
  57.    }
  58.  
  59.    /**
  60.     *@param: $file, defines the URL tot he file to be parsed
  61.     *@description: parsers the XML from the file specifies
  62.     **/
  63.    function parseXML($file) {
  64.            $this->_openFile($file);
  65.            xml_parse($this->parser$this->xml_data);
  66.            $this->doneParse();
  67.            $this->free();
  68.    }
  69.    
  70.    function _startElementHandler($parser$name$attribs) {
  71.            $this->ent_c++; //entities fix
  72.            $this->tag_pos++; //increases the tag position counter
  73.        $this->stack[] = $name;
  74.        $this->curr_tag = $this->stack[$this->tag_pos];
  75.        $this->startElementHandler($name$attribs);
  76.    }
  77.  
  78.    function _endElementHandler($parser$name) {
  79.            $this->ent_c++; //entites fix
  80.            $this->tag_pos-=1;
  81.            array_pop($this->stack);
  82.            if($this->tag_pos!=-1) {//keeps track of what the current tag is
  83.                $this->curr_tag = $this->stack[$this->tag_pos];
  84.            } else {$curr_tag=0;}
  85.            $this->endElementHandler($name);
  86.    }
  87.    
  88.    function _dataHandler($parser$data) {//handles the character data
  89.            if($this->prev_ent_c == $this->ent_c) {//if the parser is looking at the same cell
  90.                $this->repeat = true//then it is a repeat
  91.            } else {//if not then it is not a repeat
  92.                $this->repeat = false;
  93.            }
  94.            $this->prev_ent_c = $this->ent_c;
  95.            $this->dataHandler($data)//send the data off to the parent function
  96.    }
  97.    
  98.    function free() {
  99.            xml_parser_free($this->parser);    
  100.    }
  101. }
  102. ?>
Avatar de Usuario
fsans
Site Admin
 
Mensajes: 553
Registrado: 09 Abr 2008, 11:04
Ubicación: Barcelona

Volver a Code <c> Tips and Tricks



¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron