source: pro-violet-viettel/sourcecode/application/libraries/Xml.php @ 382

Last change on this file since 382 was 289, checked in by dungnv, 11 years ago
File size: 6.2 KB
Line 
1<?php
2#$Id$
3
4/*
5* XML.inc.php
6*
7* Class to convert an XML file into an object
8*
9* Copyright (C) 2006  Oliver Strecke <oliver.strecke@browsertec.de>
10*
11*   This library is free software; you can redistribute it and/or
12*   modify it under the terms of the GNU Lesser General Public
13*   License as published by the Free Software Foundation; either
14*   version 2 of the License, or (at your option) any later version.
15*
16*   This library is distributed in the hope that it will be useful,
17*   but WITHOUT ANY WARRANTY; without even the implied warranty of
18*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19*   Lesser General Public License for more details.
20*
21*   You should have received a copy of the GNU Lesser General Public
22*   License along with this library; if not, write to the Free Software
23*   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
24*/
25
26class Xml{
27        var $_parser;
28        var $_xml_data;
29        var $_actual_tag;
30
31        //Constructor...
32        function xml($encoding="UTF-8"){
33            $this->_parser=xml_parser_create($encoding);
34            $this->_xml_data="";
35            $this->_actual_tag=$this;
36       
37            xml_set_object($this->_parser,$this);
38            xml_parser_set_option($this->_parser,XML_OPTION_CASE_FOLDING,false);
39            xml_set_element_handler($this->_parser,"tag_open","tag_close");
40            xml_set_character_data_handler($this->_parser,"tag_data");
41            xml_set_default_handler($this->_parser,"tag_data");
42        }
43
44        //get XML data from file...
45        function file_read($xml_file){
46                if(file_exists($xml_file)){
47                        $this->_xml_data=implode("",file($xml_file));
48                        return 1;
49                }else{
50                        return 0;
51                }
52
53        }
54
55        //parse XML data...
56        function parse($xml_data=0){
57                if($xml_data)$this->_xml_data=$xml_data;
58                xml_parse($this->_parser,$this->_xml_data);
59          xml_parser_free($this->_parser);
60          return 1;
61        }
62
63  function tag_open($parser,$name,$attrs){
64        //create new tag...
65        #$actual_tag=&$this->_actual_tag;
66        $tag=new XML_TAG($this->_actual_tag);
67        $tag->_name=$name;
68        $tag->_param=$attrs;
69        if($name=="br" && isset($this->_actual_tag->_value))$this->_actual_tag->_value=$this->_actual_tag->_value."\n"; else $this->_actual_tag->_value="\n";
70
71        //add tag object to parent/actual tag object...
72        #if(is_object($this->_actual_tag)){
73        if(!is_a($this->_actual_tag,"XML")){
74        #if(is_object($this->_actual_tag->$name) || is_array($this->_actual_tag->$name)){
75                if(isset($this->_actual_tag->$name)){
76                        //same child objects -> Array...
77                        $last_index=$this->_actual_tag->new_child_array($tag,$name);
78                        $this->_actual_tag=&$this->_actual_tag->{$name}[$last_index];
79                }else{
80                        //add new child object to actual tag...
81                        $this->_actual_tag->new_child($tag,$name);
82            $this->_actual_tag=&$this->_actual_tag->$name;
83                }
84        }else{
85                //copy first tag object in this object...
86                $this->$name=$tag;
87                $this->_actual_tag=&$this->{$name};
88        }
89        return 1;
90  }
91
92  function tag_data($parser,$string){
93        if(strlen(trim($string))>0){
94          if(isset($this->_actual_tag->_value))$this->_actual_tag->_value=$this->_actual_tag->_value.$string; else $this->_actual_tag->_value=$string;
95        }
96    return 1;
97  }
98
99  function tag_close($parser,$name){
100    $this->_actual_tag=&$this->_actual_tag->_parent;
101    return 1;
102  }
103
104  function file_write($xml_file){
105    $fp=fopen($xml_file,"w");
106    preg_match_all("/\<\?xml(.*)\?\>/",$this->_xml_data,$result_array);
107    if(is_array($result_array)){
108      foreach($result_array[1] as $header){
109        fputs($fp,"<?xml$header?>\n");
110      }
111    }
112    $this->tag_write($fp,$this);
113    fclose($fp);
114    return 1;
115  }
116
117  function tag_write($fp,$tag,$indent=0){
118    $return=0;
119    $tmp_array=get_object_vars($tag);
120    $indent_string="";
121    for($i=0;$i<$indent;$i++)$indent_string.="  ";
122    foreach($tmp_array as $tag_name=>$tag){
123      if(is_a($tag,"XML_TAG") && substr($tag_name,0,1)!="_"){
124        $return=1;
125        fputs($fp,"\n$indent_string<$tag_name");
126        foreach($tag->_param as $name=>$value){
127          fputs($fp," $name='".htmlentities($value)."'");
128        }
129        fputs($fp,">");
130        $result=$this->tag_write($fp,$tag,$indent+1);
131        if($result){
132          fputs($fp,"\n");
133          fputs($fp,"$indent_string</$tag_name>");
134        }else{
135          fputs($fp,htmlentities($tag->_value));
136          fputs($fp,"</$tag_name>");
137        }
138      }else if(is_array($tag) && substr($tag_name,0,1)!="_"){
139        $return=1;
140        foreach($tag as $i=>$tmp_tag){
141          fputs($fp,"\n$indent_string<$tag_name");
142          foreach($tmp_tag->_param as $name=>$value){
143            fputs($fp," $name='".htmlentities($value)."'");
144          }
145          fputs($fp,">");
146          $result=$this->tag_write($fp,$tmp_tag,$indent+1);
147          if($result){
148            fputs($fp,"\n");
149            fputs($fp,"$indent_string</$tag_name>");
150          }else{
151            fputs($fp,htmlentities($tmp_tag->_value));
152            fputs($fp,"</$tag_name>");
153          }
154        }
155      }
156    }
157    return $return;
158  }
159
160        //Debug...
161        function debug($exit=0){
162                echo "<pre>";
163                print_r($this);
164                echo "</pre>";
165                if($exit)exit;
166        }
167}
168
169class XML_TAG{
170        var $_parent;
171        var $_name;
172        var $_value;
173        var $_param;
174
175        //Constructor...
176        function xml_tag(&$parent){
177    $this->_parent=&$parent;
178                $this->_name="";
179                $this->_value=false;
180                $this->_param=Array();
181                return 1;
182        }
183
184        //simply add new child to this object...
185        function new_child($child,$child_name){
186          if(isset($this->$child_name)){
187      $this->new_child_array($child,$child_name);
188          }else{
189          $this->$child_name=&$child;
190          }
191        }
192
193        //add child array for more same childs to this object...
194        function new_child_array($child,$child_name){
195                //create array and set old child object to the first array element...
196                if(is_object($this->$child_name)){
197                        $tmp_obj=$this->$child_name;
198                        $this->$child_name=Array();
199                        $this->new_child_array($tmp_obj,$child_name);
200                }
201                //push child reference into child array...
202                $this->{$child_name}[]=&$child;
203                $last_index=count($this->$child_name)-1;
204                return $last_index;
205        }
206
207        //Debug...
208        function debug(){
209          echo "<pre>";
210          print_r($this);
211          echo "</pre>";
212        }
213}
214?>
Note: See TracBrowser for help on using the repository browser.