All pastes #291295 Raw Edit

Unnamed

public text v1 · immutable
#291295 ·published 2006-12-25 00:13 UTC
rendered paste body
<?php
// by dmeekins att gmail doot com
// http://uk2.php.net/xml

// adjusted by Tommeh

class XMLParser
{
  var $parser;
  var $document;
  var $current;
  var $tagStack;
   
  function XMLParser()
  {
   $this->parser = xml_parser_create();
   $this->document = array();
   $this->currTag = &$this->document;
  }
  
  function parse($xml)
  {
    $this->current = &$this->document;
    xml_set_object($this->parser, $this);
    xml_set_character_data_handler($this->parser, 'dataHandler');
    xml_set_element_handler($this->parser, 'startHandler', 'endHandler');
    
    if(!xml_parse($this->parser, $xml, 1))
    {
       print sprintf("XML error: %s at line %d",
                   xml_error_string(xml_get_error_code($this->parser)),
                   xml_get_current_line_number($this->parser)); 
      return false;
    }
    
    xml_parser_free($this->parser);
    
    return true;
  }
  
  function startHandler($parser, $name, $attribs)
  {
    // create array for the new <$name> tag to live in
    $new_tag = array();
    
    // give this tag a reference to its parent tag
    $new_tag["tag-parent"] = &$this->current;
    
    // let this tag remember its name
    $new_tag["tag-name"] = $name;

    // add this new tag to the current tag
    if (!isset($this->current[$name]))
    {
      $this->current[$name] = array();
    }
    $this->current[$name][] = &$new_tag;

    // make the current tag the new tag
    $this->current = &$new_tag;
  }
  
  function dataHandler($parser, $data)
  {
    $data = trim($data);
    if ($data=="")
    {
      return;
    }

    // add data to the current tag
    if (!isset($this->current["data"]))
    {
      $this->current["data"] = "";
    }
    $this->current["data"].=$data;
  }
  
  function endHandler($parser, $name)
  {
    // tag </$name> has been closed, check we closed the right one,
    if ($this->current["tag-name"]!=$name)
    {
      print "Bad XML";
      exit();
    }

    $temp = &$this->current["tag-parent"];

    // clean up temps
    unset($this->current["tag-parent"]);
    unset($this->current["tag-name"]);    

    // make the current tag the parent of the current tag
    $this->current = &$temp;
  }
}
?>