source: pmb4.2/trunk/fuentes/pmb/includes/parser.inc.php @ 828

Last change on this file since 828 was 815, checked in by jrpelegrina, 4 years ago

Initial release of pmb 4.2

  • Property svn:executable set to *
File size: 6.6 KB
Line 
1<?php
2// +-------------------------------------------------+
3// © 2002-2004 PMB Services / www.sigb.net pmb@sigb.net et contributeurs (voir www.sigb.net)
4// +-------------------------------------------------+
5// $Id: parser.inc.php,v 1.18 2013-11-07 09:22:27 dgoron Exp $
6
7if (stristr($_SERVER['REQUEST_URI'], ".inc.php")) die("no access");
8
9/*----------------------------------------------------------------------------------------
10 Fonctions pour parser un fichier XML
11 La fonction à appeler est _parser_ avec comme arguments :
12     $nom_fichier : le nom du fichier XML
13     $fonction : la lise des fonctions associées aux tags de niveau 2
14     $rootelement : l'élément root du fichier XML
15----------------------------------------------------------------------------------------*/
16
17// Lecture récursive de la structure et stockage des paramètres
18
19function _recursive_(&$indice, $niveau, &$param, &$tag_count, &$vals) {
20        if ($indice > count($vals))
21                exit;
22        while ($indice < count($vals)) {
23                list ($key, $val) = each($vals);
24                $indice ++;
25                if (!isset($tag_count[$val["tag"]]))
26                        $tag_count[$val["tag"]] = 0;
27                else {
28                        $tag_count[$val["tag"]]++;
29                }
30                if (isset($val["attributes"])) {
31                        $attributs = $val["attributes"];
32                        for ($k = 0; $k < count($attributs); $k ++) {
33                                list ($key_att, $val_att) = each($attributs);
34                                $param[$val["tag"]][$tag_count[$val["tag"]]][$key_att] = $val_att;
35                        }
36                }
37                if ($val["type"] == "open") {
38                        $tag_count_next = array();
39                        _recursive_( $indice, $niveau +1,  $param[$val["tag"]][$tag_count[$val["tag"]]],  $tag_count_next,  $vals);
40                }
41                if ($val["type"] == "close") {
42                        if ($niveau > 2)
43                                break;
44                }
45                if ($val["type"] == "complete") {
46                        $param[$val["tag"]][$tag_count[$val["tag"]]]["value"] = $val["value"];
47                }
48        }
49}
50
51//Parse le fichier [nom_fichier] et exécute les fonctions liées aux tags
52
53function _parser_($nom_fichier, $fonction, $rootelement) {
54        global $charset;
55        $vals = array();
56        $index = array();
57        if ($file = fopen($nom_fichier, "r")) {
58                $simple = fread($file, filesize($nom_fichier));
59                fclose($file);
60                $rx = "/<?xml.*encoding=[\'\"](.*?)[\'\"].*?>/m";
61                if (preg_match($rx, $simple, $m)) $encoding = strtoupper($m[1]);
62                        else $encoding = "ISO-8859-1";
63                //encodages supportés par les fonctions suivantes
64                if (($encoding != "ISO-8859-1") && ($encoding != "UTF-8") && ($encoding != "US-ASCII")) $encoding = "ISO-8859-1";
65                $p = xml_parser_create($encoding);
66                xml_parser_set_option($p, XML_OPTION_TARGET_ENCODING, $charset);               
67                xml_parser_set_option($p, XML_OPTION_SKIP_WHITE, 1);
68                        if (xml_parse_into_struct($p, $simple,  $vals,  $index) == 1) {
69                        xml_parser_free($p);
70                        $param = array();
71                        $tag_count = array();
72                        $indice=0;
73                        _recursive_($indice, 1,  $param,  $tag_count,  $vals);
74                }
75                unset($vals, $index);
76                if (is_array($param)) {
77                        if (count($param[$rootelement]) != 1) {
78                                echo "Erreur, ceci, n'est pas un fichier $rootelement !";
79                                exit;
80                        }
81                        $param_var = $param[$rootelement][0];
82                        for ($i = 0; $i < count($param_var); $i ++) {
83                                list ($key, $val) = each($param_var);
84                                if (isset($fonction[$key])) {
85                                        for ($j = 0; $j < count($val); $j ++) {
86                                                $param_fonction = $val[$j];
87                                                eval($fonction[$key]."(\$param_fonction);");
88                                        }
89                                }
90                        }
91                }
92        }
93}
94
95function _parser_text_($xml, $fonction, $rootelement) {
96        global $charset;
97        $vals = array();
98        $index = array();
99        if ($xml) {
100                $simple = $xml;
101               
102                $rx = "/<?xml.*encoding=[\'\"](.*?)[\'\"].*?>/m";
103                if (preg_match($rx, $simple, $m)) $encoding = strtoupper($m[1]);
104                        else $encoding = "ISO-8859-1";
105                //encodages supportés par les fonctions suivantes
106                if (($encoding != "ISO-8859-1") && ($encoding != "UTF-8") && ($encoding != "US-ASCII")) $encoding = "ISO-8859-1";
107                $p = xml_parser_create($encoding);
108                xml_parser_set_option($p, XML_OPTION_TARGET_ENCODING, $charset);               
109                xml_parser_set_option($p, XML_OPTION_SKIP_WHITE, 1);
110                if (xml_parse_into_struct($p, $simple,  $vals,  $index) == 1) {
111                        xml_parser_free($p);
112                        $param = array();
113                        $tag_count = array();
114                        $indice=0;
115                        _recursive_($indice, 1,  $param,  $tag_count,  $vals);
116                }
117                unset($vals, $index);
118                if (is_array($param)) {
119                        if (count($param[$rootelement]) != 1) {
120                                echo "Erreur, ceci, n'est pas un fichier $rootelement !";
121                                exit;
122                        }
123                        $param_var = $param[$rootelement][0];
124                        for ($i = 0; $i < count($param_var); $i ++) {
125                                list ($key, $val) = each($param_var);
126                                if (isset($fonction[$key])) {
127                                        for ($j = 0; $j < count($val); $j ++) {
128                                                $param_fonction = $val[$j];
129                                                eval($fonction[$key]."(\$param_fonction);");
130                                        }
131                                }
132                        }
133                }
134        }
135}
136
137function _parser_text_no_function_($xml, $rootelement="") {
138        global $charset;
139        $vals = array();
140        $index = array();
141        if ($xml) {
142                $simple = $xml;
143                $rx = "/<?xml.*encoding=[\'\"](.*?)[\'\"].*?>/m";
144                if (preg_match($rx, $simple, $m)) $encoding = strtoupper($m[1]);
145                        else $encoding = "ISO-8859-1";
146                //encodages supportés par les fonctions suivantes
147                if (($encoding != "ISO-8859-1") && ($encoding != "UTF-8") && ($encoding != "US-ASCII")) $encoding = "ISO-8859-1";
148                $p = xml_parser_create($encoding);
149                xml_parser_set_option($p, XML_OPTION_TARGET_ENCODING, $charset);               
150                xml_parser_set_option($p, XML_OPTION_SKIP_WHITE, 1);
151               
152                if (xml_parse_into_struct($p, $simple,  $vals,  $index) == 1) {
153                        xml_parser_free($p);
154                        $param = array();
155                        $tag_count = array();
156                        $indice=0;
157                        _recursive_($indice, 1,  $param,  $tag_count,  $vals);
158                } else {
159                        echo xml_error_string(xml_get_error_code($p))." ". xml_get_current_line_number($p);
160                }
161                unset($vals, $index);
162                if (is_array($param)) {
163                        if ($rootelement) {
164                                if (count($param[$rootelement]) != 1) {
165                                        echo "Erreur, ceci n'est pas un fichier $rootelement !";
166                                        exit;
167                                }
168                                $param_var = $param[$rootelement][0];
169                        } else $param_var = $param;
170                        return $param_var;
171                }
172        }
173}
174
175function recurse_xml($param, $level,$tagname,$lowercase=false) {
176        if ($lowercase) $tagname1=strtolower($tagname); else $tagname1=$tagname;
177        $ret=str_repeat(" ",$level)."<".$tagname1;
178        $ret_sub="";
179        $value="";
180        if ($param=="") $param=array();
181        while (list($key,$val)=each($param)) {
182                if (is_array($val)) {
183                        for ($i=0; $i<count($val); $i++) {
184                                if ($lowercase) $key1=strtolower($key); else $key1=$key;
185                                $ret_sub.=recurse_xml($val[$i],$level+1,$key,$lowercase)."</".$key1.">\n";
186                        }
187                } else {
188                        if ($key!="value") {   
189                                if ($lowercase) $key1=strtolower($key); else $key1=$key;
190                                $ret.=" ".$key1."=\"$val\"";
191                        }
192                        else
193                                $value=$val;   
194                }
195        }
196        $ret.=">".$value;
197        if ($ret_sub!="") $ret.="\n".$ret_sub.str_repeat(" ",$level);
198        return $ret;
199}
200       
201function array_to_xml($param,$rootelement,$lowercase=false) {
202        return recurse_xml($param,0,$rootelement,$lowercase)."</$rootelement>";
203}
204?>
Note: See TracBrowser for help on using the repository browser.