<?php
 
 
/**
 
 * xmltoarray_parser_htmlfix creates an associative array of XML values, while fixing
 
 *    various html special characters so that the xml_parser does not break in the process.
 
 * @author Allan Bogh - [email protected]
 
 * @version 1.0
 
 *
 
 * Proper usage for xmltoarray_parser_htmlfix class:
 
 *         $xmltoarray = new xmltoarray_parser_htmlfix(); //create instance of class
 
 *        $xmltoarray->xmlparser_setoption(XML_OPTION_SKIP_WHITE, 1); //set options same as xml_parser_set_option
 
 *        $xmltoarray->xmlparser_setoption(XML_OPTION_CASE_FOLDING, 0);
 
 *        $xmltoarray->xmlparser_fix_into_struct($xmlstring); //fixes html values for XML
 
 *        $array = $xmltoarray->createArray(); //creates an array with fixed html values
 
 *        foreach($array as $key => $value){ 
 
 *            $array[$key] = $xmltoarray->fix_html_entities($value); //returns proper html values
 
 *        }
 
 *         
 
 */
 
class xmltoarray_parser_htmlfix{
 
    var $values; 
 
    var $index; 
 
    var $thearray; 
 
    var $parser;
 
    
 
    /**
 
     * Default constructor for xmltoarray_parser_htmlfix.
 
     */
 
    function xmltoarray_parser_htmlfix(){
 
        $this->values = array(); 
 
        $this->index  = array(); 
 
        $this->thearray  = array(); 
 
        $this->parser = xml_parser_create();
 
    }
 
    
 
    /**
 
     * xmlparser_setoption sets XML options based on xml_parser_set_option options.
 
     * @param $optionName - The name of the option from the xml_parser_set_option list.
 
     * @param $value - The value to set for the option.
 
     */
 
    function xmlparser_setoption($optionName, $value){
 
        xml_parser_set_option($this->parser, $optionName, $value);
 
    }
 
    
 
    /**
 
     * xmlparser_fix_into_struct fixes the XML and passes the XML into the struct parser.
 
     * @param $xml - A string XML value.
 
     */
 
    function xmlparser_fix_into_struct($xml){
 
        $trans_table = get_html_translation_table(HTML_ENTITIES,ENT_QUOTES);
 
        $keys = array();
 
        foreach($trans_table as $key=>$value) {
 
            if($key != "<" && $key != ">" && $key != "&" && $key != "\"" && $key != "'" && $key != " "){
 
                $keys[$key] = $value;
 
            }
 
        }
 
        foreach($keys as $key=>$value){
 
            $xml =  preg_replace("/".$key."/",$value,$xml);
 
        }
 
        $xml =  str_replace("&","%and%",$xml);
 
        
 
        xml_parse_into_struct($this->parser, $xml, $this->values, $this->index);
 
        xml_parser_free($this->parser);
 
    }
 
    
 
    /**
 
     * createArray creates and returns the array.
 
     * @return The associative XML array.
 
     */
 
    function createArray(){
 
        $i = 0; 
 
        $name = isset($this->values[$i]['tag']) ? $this->values[$i]['tag']: ''; 
 
        $this->thearray[$name] = isset($this->values[$i]['attributes']) ? $this->values[$i]['attributes'] : ''; 
 
        $this->thearray[$name] = $this->_struct_to_array($this->values, $i); 
 
        return $this->thearray; 
 
    }//createArray
 
    
 
    /**
 
     * _struct_to_array is a recursive function that takes the values and creates the array.
 
     * @param $values - The values of the XML
 
     * @param &$i - The index value
 
     * @return The child
 
     */
 
    function _struct_to_array($values, &$i){
 
        $child = array(); 
 
        if (isset($values[$i]['value'])) array_push($child, $values[$i]['value']); 
 
        
 
        while ($i++ < count($values)) { 
 
            if(isset($values[$i])){
 
                switch ($values[$i]['type']) { 
 
                    case 'cdata': 
 
                    array_push($child, $values[$i]['value']); 
 
                    break; 
 
                    
 
                    case 'complete': 
 
                        $name = $values[$i]['tag']; 
 
                        if(!empty($name)){
 
                        $child[$name]= (isset($values[$i]['value']))?($values[$i]['value']):''; 
 
                        if(isset($values[$i]['attributes'])) {                    
 
                            $child[$name] = $values[$i]['attributes']; 
 
                        } 
 
                    }    
 
                    break; 
 
                    
 
                    case 'open': 
 
                        $name = $values[$i]['tag']; 
 
                        $size = isset($child[$name]) ? sizeof($child[$name]) : 0;
 
                        $child[$name][$size] = $this->_struct_to_array($values, $i); 
 
                    break;
 
                    
 
                    case 'close': 
 
                    return $child; 
 
                    break; 
 
                }
 
            }
 
        }
 
        return $child; 
 
    }//_struct_to_array
 
 
    /**
 
     * fix_html_entities replaces all instances of '%and%' with '&', since the xml_parser can't handle '&'.
 
     * @param $string - A string value.
 
     * @return A fixed string with & instead of %and%.
 
     */
 
    function fix_html_entities($string){
 
        $string =  str_replace("%and%","&",$string);
 
        return $string;
 
    }
 
 
}
 
 
?>
 
 |