source: admin/WebConsole/clases/XmlPhp.php

qndtest
Last change on this file was b6ec162, checked in by Ramón M. Gómez <ramongomez@…>, 5 years ago

#834: Remove all redundant PHP closing tags.

  • Property mode set to 100644
File size: 11.9 KB
Line 
1<?php
2/*================================================================================
3Esta clase implementa funciones de utilidad para tratar ficheros XML
4
5        Parametros del constructor:
6                fxml=Fichero XML que contiene los atributos de los nodos
7                fileocade=Indica si el dato anterior es un fichero o una variable con el contenido del árbol:
8                        0: Es una cadena
9                        1: Es un fichero
10
11        Especificaciones:
12                Se le llama información del nodo al nombre del nodo + sus atributos eliminando los marcadores
13                de comienzo:"<" y fin:">"
14================================================================================*/
15class XmlPhp{
16        var $buffer;
17        var $nptr;
18
19        function __construct($fxml, $fileocade){ // Constructor
20                if ($fileocade==0){
21                        $this->nptr=1;
22                        $this->buffer=trim($fxml);
23                }
24                else{
25                        $tbuffer=filesize($fxml); // Calcula tamaño del fichero
26                        if ($tbuffer>0){ // EL fichero tiene contenido
27                                $fd=fopen($fxml, "r");
28                                $this->buffer=fread ($fd,$tbuffer);
29                                fclose ($fd);
30                                $this->nptr=1;
31                                $this->buffer=trim($this->buffer);
32                        }
33                }
34                $this->buffer=preg_replace("/[\n\r\t]/"," ", $this->buffer );
35        }
36        /* -------------------------------------------------------------------------------------------
37                Recupera la información del primer nodo (nodo raiz) del arbol.Devuelve false en caso de que
38                no tenga hijos o bien no exista documento XML que analizar.
39        ---------------------------------------------------------------------------------------------*/
40        function InfoNodoRaiz(){
41                if (!$this->NodoRaiz()) // No existe documento XML
42                        return(false);
43                return($this->Infonodo());
44        }
45        /* -------------------------------------------------------------------------------------------
46                Establece el puntero de nodos al primer nodo del árbol (nodo raiz). Devuelve  false en caso
47                de que no exista documento XML que analizar.
48        ---------------------------------------------------------------------------------------------*/
49        function NodoRaiz(){
50                if ($this->buffer==null) return(false); // No existe documento XML
51                $this->nptr=0;
52                while ($this->nptr<strlen($this->buffer))
53                        if ('<'==substr($this->buffer,$this->nptr++,1)) return(true);
54                return(false);
55        }
56        /* -------------------------------------------------------------------------------------------
57                Recupera la información del primer nodo hijo del nodo actual. Devuelve false en caso de que
58                no tenga hijos o bien no exista documento XML que analizar.
59        ---------------------------------------------------------------------------------------------*/
60        function InfoPrimerNodoHijo(){
61                if (!$this->PrimerNodoHijo()) // No tiene hijos o no existe documento XML
62                        return(false);
63                return($this->Infonodo());
64        }
65        /* -------------------------------------------------------------------------------------------
66                Establece el puntero de nodos al primer nodo hijo del nodo actual. Devuelve  false en caso
67                de que no tenga hijos o bien no exista documento XML que analizar.
68        ---------------------------------------------------------------------------------------------*/
69        function PrimerNodoHijo(){
70                if ($this->buffer==null) return(false); // No existe documento XML
71                $gnptr=$this->nptr;
72                while ($this->nptr<strlen($this->buffer))
73                        if ('<'==substr($this->buffer,$this->nptr++,1)) break;
74                        $lon=$this->nptr;
75                        if ('/'==substr($this->buffer,$lon,1)){ // No tiene hijos
76                        $this->nptr=$gnptr;
77                        return(false);
78                }
79                return(true);
80        }
81        /* -------------------------------------------------------------------------------------------
82                Recupera la información del siguiente nodo hermano del actual. Devuelve false en caso de que
83                el nodo actual sea el último de sus hermanos o bien no exista documento XML que analizar.
84        ---------------------------------------------------------------------------------------------*/
85        function InfoSiguienteNodoHermano(){
86                if (!$this->SiguienteNodoHermano()) // No tiene hermanos o no existe documento XML
87                        return(false);
88                return($this->Infonodo());
89        }
90        /* -------------------------------------------------------------------------------------------
91                Establece el puntero de nodos al siguiente nodo hermano del nodo actual. Devuelve  false en
92                caso de que el nodo actual sea el último de los hermanos o bien no exista documento XML que analizar.
93        ---------------------------------------------------------------------------------------------*/
94        function SiguienteNodoHermano(){
95                if ($this->buffer==null) return(false); // No existe documento XML
96                $gnptr=$this->nptr;
97                $resul=$this->_siguiente_hermano();
98                if (!$resul){
99                        $this->nptr=$gnptr; // Es el último hermano
100                        return(false);
101                }
102                return(true);
103        }
104        /* -------------------------------------------------------------------------------------------
105                Establece el puntero de nodos al siguiente nodo hermano del actual
106        ---------------------------------------------------------------------------------------------*/
107        function _siguiente_hermano(){
108                $lon=$this->nptr;
109                $sw=1;
110                $nombrenodo=$this->NombreNodo();
111                while (1){
112                        $lon = strpos($this->buffer,'<',++$lon);
113                        if (substr($this->buffer,++$lon,1)=='/')
114                                $sw--;
115                        else
116                                $sw++;
117                        if ($sw==0){
118                                while ($lon<strlen($this->buffer)){
119                                        if (substr($this->buffer,$lon++,1)=='<'){
120                                                if (substr($this->buffer,$lon,1)=='/')
121                                                        return(false); // Es el último hermano
122                                                else{
123                                                        $this->nptr=$lon;
124                                                        return(true);
125                                                }
126                                        }
127                                }
128                                return(false); // Se trata del nodo raiz
129                        }
130                }
131        }
132        /* -------------------------------------------------------------------------------------------
133                Recupera el número de hijos del nodo actual
134        ---------------------------------------------------------------------------------------------*/
135        function NumerodeHijos(){
136                $gnptr=$this->nptr;
137                $nh=0;
138                if ($this->PrimerNodoHijo()){
139                        $nh++;
140                        while ($this->SiguienteNodoHermano()) $nh++;
141                }
142                $this->nptr=$gnptr;
143                return($nh);
144        }
145        /* -------------------------------------------------------------------------------------------
146                Devuelve true si el nodo es el último de sus hermanos
147        ---------------------------------------------------------------------------------------------*/
148        function EsUltimoHermano(){
149                $gnptr=$this->nptr;
150                if (!$this->SiguienteNodoHermano()){
151                        $this->nptr=$gnptr;
152                        return(true);
153                }
154                $this->nptr=$gnptr;
155                return(false);
156        }
157        /* -------------------------------------------------------------------------------------------
158                Devuelve los atributos del nodo.
159                Parámetros:
160                        Si se aporta el puntero del nodo se devolverán los atributos del nodo apuntado
161                        pero si no se especifican argumentos se devuelven los atributos del nodo actual.
162        ---------------------------------------------------------------------------------------------*/
163        function Atributos($ptrnodo=-1){
164                if ($ptrnodo!=-1)
165                        $this->_setnodo($ptrnodo);
166                $atributosHTML="";
167                $info=$this->Infonodo();
168                $pos=strpos($info," ");
169                if ($pos) // El nodo tiene atributos
170                        $atributosHTML=" ".substr($info,$pos);
171                return($atributosHTML);
172        }
173        /* -------------------------------------------------------------------------------------------
174                Posiciona el puntero de nodos
175        ---------------------------------------------------------------------------------------------*/
176        function _setnodo($ptrnodo){
177                $this->nptr=$ptrnodo;
178        }
179        /* -------------------------------------------------------------------------------------------
180                Devuelve el puntero del nodo actual
181        ---------------------------------------------------------------------------------------------*/
182        function Nodo(){
183                return($this->nptr);
184        }
185        /* -------------------------------------------------------------------------------------------
186                Recupera el nombre del nodo
187        ---------------------------------------------------------------------------------------------*/
188        function NombreNodo(){
189                $infonodo=$this->Infonodo();
190                $trozos=explode(" ",$infonodo);
191                return ($trozos[0]);
192        }
193        /* -------------------------------------------------------------------------------------------
194                Recupera la información del nodo actual
195        ---------------------------------------------------------------------------------------------*/
196        function Infonodo(){
197                if ($this->buffer==null) return(false); // No existe documento XML
198                $lon=$this->nptr; 
199                while ($lon<strlen($this->buffer))
200                        if ('>'==substr($this->buffer,++$lon,1)) break;
201                $info=trim(substr($this->buffer,$this->nptr,$lon-$this->nptr));
202                $info=str_replace("[","<",$info); 
203                $info=str_replace("]",">",$info); 
204                return $info;
205        }
206        /* -------------------------------------------------------------------------------------------
207                Recorre el arbol de nodos del documento XML y para cada nodo genera un evento que se
208                puede capturar a través de una funcion que tiene esta forma:
209                        fNodoXML(nivel,infonodo) donde:
210                                - nivel es el nivel de profundidad del nodo (en base 0)
211                                - infonodo es toda la información contenida en el nodo.
212        ---------------------------------------------------------------------------------------------*/
213        function RecorreArboXML(){
214                if (!$this->NodoRaiz()) return; // No existe documento XML que analizar
215                $this->_arbolXmlrecur(0);
216        }
217        // -------------------------------------------------------------------------------------
218        // Recorrido recursivo del arbol XML
219        // -------------------------------------------------------------------------------------
220        function _arbolXmlrecur($nivel){
221                do{
222                        $infonodo=$this->Infonodo();
223                        fNodoXML($nivel,$infonodo); 
224                        $gnptr=$this->nptr;
225                        if ($this->PrimerNodoHijo())
226                                $this->_arbolXmlrecur($nivel+1);
227                        $this->nptr=$gnptr;
228                }while($this->SiguienteNodoHermano());
229        }
230        /*------------------------------------------------------------------------------------------------
231                Elimina un atributo de la información del nodo
232                        Parametros:
233                                - nombreatributo:El nombre del atributo
234                                - info: La información del Nodo
235        ------------------------------------------------------------------------------------------------*/
236        function EliminaAtributo($nombreatributo,$info){
237                $nada="";
238                return($this->TomaAtributo($nombreatributo,$nada,$info,true));
239        }
240        /*------------------------------------------------------------------------------------------------
241                Recupera el valor del atributo y lo elimina de la información del nodo
242                        Parametros:
243                                - nombreatributo:El nombre del atributo
244                                - puntero: Referencia a la variable que contendrá el valor del atributo
245                                - info: La información del Nodo
246        ------------------------------------------------------------------------------------------------*/
247        function TomaAtributoEspecial($nombreatributo,&$puntero,$info){
248                return($this->TomaAtributo($nombreatributo,$puntero,$info,true));
249        }
250        /*------------------------------------------------------------------------------------------------
251                Recupera el valor del atributo
252                        Parametros:
253                                - nombreatributo:El nombre del atributo
254                                - puntero: Referencia a la variable que contendrá el valor del atributo
255                                - info: La información del Nodo
256                                - sw: Si vale true el atributo se eliminará de la información del nodo
257        ------------------------------------------------------------------------------------------------*/
258        function TomaAtributo($nombreatributo,&$puntero,$info,$swkill=false){
259                $doblescomillas='"';
260                $strAtributo=" ".$nombreatributo."=";
261                $pos=strpos($info,$strAtributo); 
262                if (!$pos){
263                        $puntero=null;
264                        return($info);
265                }
266                $pos+=strlen($strAtributo);  // Avanza hasta el signo igual
267                $posa=$pos; // Primera posición del valor del atributo
268                $swcomillas=false;
269                while ($pos<strlen($info)){
270                        if ($doblescomillas==substr($info,$pos,1)) $swcomillas=!$swcomillas;
271                        if (' '==substr($info,$pos,1) || '> '==substr($info,$pos,1))
272                                if (!$swcomillas) break;
273                        $pos++;
274                }
275                $posb=$pos;
276                $valoratributo=substr($info,$posa,$posb-$posa);
277                if ($swkill) // Eliminar el atributo de la la cadena
278                        $info=str_replace($strAtributo.$valoratributo,"",$info); // Elimina el atributo de la información
279                if ($doblescomillas==substr($valoratributo,0,1)) // Elimina las comillas
280                                $valoratributo=str_replace($doblescomillas,"",$valoratributo);
281                $puntero=$valoratributo;
282                return($info);
283        }
284} // Fin de la clase
285
Note: See TracBrowser for help on using the repository browser.