Login   Register  
PHP Classes
elePHPant
Icontem

File: XML.inc.php

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of Oliver Strecke  >  simple XML  >  XML.inc.php  >  Download  
File: XML.inc.php
Role: Class source
Content type: text/plain
Description: XML class file/library
Class: simple XML
Parse XML documents into an hierarchy of objects
Author: By
Last change: - file_write method added (writes the xml object back to a file)
- support for multiple line data
- convert multiline data (<br />) to new lines (\n) chars
- automatic call of new_child_array method within the new_child method while adding multiple childs (no need to call the new_child_array method for multiple childs - just call the new_child method)
- optional constructor parameter encoding to change the xml-file encoding (default is ISO-8859-1)
Date: 4 years ago
Size: 6,342 bytes
 

Contents

Class file image Download
<?php
#$Id$

/*
* XML.inc.php
*
* Class to convert an XML file into an object
*
* Copyright (C) 2006  Oliver Strecke <oliver.strecke@browsertec.de>
*
*   This library is free software; you can redistribute it and/or
*   modify it under the terms of the GNU Lesser General Public
*   License as published by the Free Software Foundation; either
*   version 2 of the License, or (at your option) any later version.
*
*   This library is distributed in the hope that it will be useful,
*   but WITHOUT ANY WARRANTY; without even the implied warranty of
*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
*   Lesser General Public License for more details.
*
*   You should have received a copy of the GNU Lesser General Public
*   License along with this library; if not, write to the Free Software
*   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
*/

class XML{
    var 
$_parser;
    var 
$_xml_data;
    var 
$_actual_tag;

    
//Constructor...
    
function xml($encoding="ISO-8859-1"){
    
$this->_parser=xml_parser_create($encoding);
    
$this->_xml_data="";
    
$this->_actual_tag=$this;

    
xml_set_object($this->_parser,$this);
    
xml_parser_set_option($this->_parser,XML_OPTION_CASE_FOLDING,false);
    
xml_set_element_handler($this->_parser,"tag_open","tag_close");
    
xml_set_character_data_handler($this->_parser,"tag_data");
    
xml_set_default_handler($this->_parser,"tag_data");
    }

    
//get XML data from file...
    
function file_read($xml_file){
        if(
file_exists($xml_file)){
            
$this->_xml_data=implode("",file($xml_file));
            return 
1;
        }else{
            return 
0;
        }

    }

    
//parse XML data...
    
function parse($xml_data=0){
        if(
$xml_data)$this->_xml_data=$xml_data;
        
xml_parse($this->_parser,$this->_xml_data);
      
xml_parser_free($this->_parser);
      return 
1;
    }

  function 
tag_open($parser,$name,$attrs){
      
//create new tag...
      #$actual_tag=&$this->_actual_tag;
       
$tag=new XML_TAG($this->_actual_tag);
       
$tag->_name=$name;
       
$tag->_param=$attrs;
       if(
$name=="br" && isset($this->_actual_tag->_value))$this->_actual_tag->_value=$this->_actual_tag->_value."\n"; else $this->_actual_tag->_value="\n";

       
//add tag object to parent/actual tag object...
       #if(is_object($this->_actual_tag)){
       
if(!is_a($this->_actual_tag,"XML")){
      
#if(is_object($this->_actual_tag->$name) || is_array($this->_actual_tag->$name)){
           
if(isset($this->_actual_tag->$name)){
               
//same child objects -> Array...
               
$last_index=$this->_actual_tag->new_child_array($tag,$name);
               
$this->_actual_tag=&$this->_actual_tag->{$name}[$last_index];
           }else{
               
//add new child object to actual tag...
               
$this->_actual_tag->new_child($tag,$name);
          
$this->_actual_tag=&$this->_actual_tag->$name;
           }
       }else{
           
//copy first tag object in this object...
           
$this->$name=$tag;
           
$this->_actual_tag=&$this->{$name};
       }
       return 
1;
  }

  function 
tag_data($parser,$string){
       if(
strlen(trim($string))>0){
         if(isset(
$this->_actual_tag->_value))$this->_actual_tag->_value=$this->_actual_tag->_value.$string; else $this->_actual_tag->_value=$string;
       }
    return 
1;
  }

  function 
tag_close($parser,$name){
    
$this->_actual_tag=&$this->_actual_tag->_parent;
    return 
1;
  }

  function 
file_write($xml_file){
    
$fp=fopen($xml_file,"w");
    
preg_match_all("/\<\?xml(.*)\?\>/",$this->_xml_data,$result_array);
    if(
is_array($result_array)){
      foreach(
$result_array[1] as $header){
        
fputs($fp,"<?xml$header?>\n");
      }
    }
    
$this->tag_write($fp,$this);
    
fclose($fp);
    return 
1;
  }

  function 
tag_write($fp,$tag,$indent=0){
    
$return=0;
    
$tmp_array=get_object_vars($tag);
    
$indent_string="";
    for(
$i=0;$i<$indent;$i++)$indent_string.="  ";
    foreach(
$tmp_array as $tag_name=>$tag){
      if(
is_a($tag,"XML_TAG") && substr($tag_name,0,1)!="_"){
        
$return=1;
        
fputs($fp,"\n$indent_string<$tag_name");
        foreach(
$tag->_param as $name=>$value){
          
fputs($fp,$name='".htmlentities($value)."'");
        }
        
fputs($fp,">");
        
$result=$this->tag_write($fp,$tag,$indent+1);
        if(
$result){
          
fputs($fp,"\n");
          
fputs($fp,"$indent_string</$tag_name>");
        }else{
          
fputs($fp,htmlentities($tag->_value));
          
fputs($fp,"</$tag_name>");
        }
      }else if(
is_array($tag) && substr($tag_name,0,1)!="_"){
        
$return=1;
        foreach(
$tag as $i=>$tmp_tag){
          
fputs($fp,"\n$indent_string<$tag_name");
          foreach(
$tmp_tag->_param as $name=>$value){
            
fputs($fp,$name='".htmlentities($value)."'");
          }
          
fputs($fp,">");
          
$result=$this->tag_write($fp,$tmp_tag,$indent+1);
          if(
$result){
            
fputs($fp,"\n");
            
fputs($fp,"$indent_string</$tag_name>");
          }else{
            
fputs($fp,htmlentities($tmp_tag->_value));
            
fputs($fp,"</$tag_name>");
          }
        }
      }
    }
    return 
$return;
  }

    
//Debug...
    
function debug($exit=0){
        echo 
"<pre>";
        
print_r($this);
        echo 
"</pre>";
        if(
$exit)exit;
    }
}

class 
XML_TAG{
    var 
$_parent;
    var 
$_name;
    var 
$_value;
    var 
$_param;

    
//Constructor...
    
function xml_tag(&$parent){
    
$this->_parent=&$parent;
        
$this->_name="";
        
$this->_value=false;
        
$this->_param=Array();
        return 
1;
    }

    
//simply add new child to this object...
    
function new_child($child,$child_name){
      if(isset(
$this->$child_name)){
      
$this->new_child_array($child,$child_name);
      }else{
        
$this->$child_name=&$child;
      }
    }

    
//add child array for more same childs to this object...
    
function new_child_array($child,$child_name){
        
//create array and set old child object to the first array element...
        
if(is_object($this->$child_name)){
            
$tmp_obj=$this->$child_name;
            
$this->$child_name=Array();
            
$this->new_child_array($tmp_obj,$child_name);
        }
        
//push child reference into child array...
        
$this->{$child_name}[]=&$child;
        
$last_index=count($this->$child_name)-1;
        return 
$last_index;
    }

    
//Debug...
    
function debug(){
      echo 
"<pre>";
      
print_r($this);
      echo 
"</pre>";
    }
}
?>