[043e67d] | 1 | <?php |
---|
[3ec149c] | 2 | /*================================================================================ |
---|
| 3 | Esta 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 |
---|
[fc9a1ad] | 7 | fileocade=Indica si el dato anterior es un fichero o una variable con el contenido del árbol: |
---|
[3ec149c] | 8 | 0: Es una cadena |
---|
| 9 | 1: Es un fichero |
---|
| 10 | |
---|
| 11 | Especificaciones: |
---|
[fc9a1ad] | 12 | Se le llama información del nodo al nombre del nodo + sus atributos eliminando los marcadores |
---|
[3ec149c] | 13 | de comienzo:"<" y fin:">" |
---|
| 14 | ================================================================================*/ |
---|
| 15 | class XmlPhp{ |
---|
| 16 | var $buffer; |
---|
| 17 | var $nptr; |
---|
| 18 | |
---|
[fc9a1ad] | 19 | function __construct($fxml, $fileocade){ // Constructor |
---|
[3ec149c] | 20 | if ($fileocade==0){ |
---|
| 21 | $this->nptr=1; |
---|
| 22 | $this->buffer=trim($fxml); |
---|
| 23 | } |
---|
| 24 | else{ |
---|
[fc9a1ad] | 25 | $tbuffer=filesize($fxml); // Calcula tamaño del fichero |
---|
[3ec149c] | 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 | } |
---|
[9f1274e] | 34 | $this->buffer=preg_replace("/[\n\r\t]/"," ", $this->buffer ); |
---|
[3ec149c] | 35 | } |
---|
| 36 | /* ------------------------------------------------------------------------------------------- |
---|
[fc9a1ad] | 37 | Recupera la información del primer nodo (nodo raiz) del arbol.Devuelve false en caso de que |
---|
[3ec149c] | 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 | /* ------------------------------------------------------------------------------------------- |
---|
[fc9a1ad] | 46 | Establece el puntero de nodos al primer nodo del árbol (nodo raiz). Devuelve false en caso |
---|
[3ec149c] | 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 | /* ------------------------------------------------------------------------------------------- |
---|
[fc9a1ad] | 57 | Recupera la información del primer nodo hijo del nodo actual. Devuelve false en caso de que |
---|
[3ec149c] | 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 | /* ------------------------------------------------------------------------------------------- |
---|
[fc9a1ad] | 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. |
---|
[3ec149c] | 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 |
---|
[fc9a1ad] | 92 | caso de que el nodo actual sea el último de los hermanos o bien no exista documento XML que analizar. |
---|
[3ec149c] | 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){ |
---|
[fc9a1ad] | 99 | $this->nptr=$gnptr; // Es el último hermano |
---|
[3ec149c] | 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)=='/') |
---|
[fc9a1ad] | 121 | return(false); // Es el último hermano |
---|
[3ec149c] | 122 | else{ |
---|
| 123 | $this->nptr=$lon; |
---|
| 124 | return(true); |
---|
| 125 | } |
---|
| 126 | } |
---|
| 127 | } |
---|
| 128 | return(false); // Se trata del nodo raiz |
---|
| 129 | } |
---|
| 130 | } |
---|
| 131 | } |
---|
| 132 | /* ------------------------------------------------------------------------------------------- |
---|
[fc9a1ad] | 133 | Recupera el número de hijos del nodo actual |
---|
[3ec149c] | 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 | /* ------------------------------------------------------------------------------------------- |
---|
[fc9a1ad] | 146 | Devuelve true si el nodo es el último de sus hermanos |
---|
[3ec149c] | 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. |
---|
[fc9a1ad] | 159 | Parámetros: |
---|
| 160 | Si se aporta el puntero del nodo se devolverán los atributos del nodo apuntado |
---|
[3ec149c] | 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(); |
---|
[9f1274e] | 190 | $trozos=explode(" ",$infonodo); |
---|
[3ec149c] | 191 | return ($trozos[0]); |
---|
| 192 | } |
---|
| 193 | /* ------------------------------------------------------------------------------------------- |
---|
[fc9a1ad] | 194 | Recupera la información del nodo actual |
---|
[3ec149c] | 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 |
---|
[fc9a1ad] | 208 | puede capturar a través de una funcion que tiene esta forma: |
---|
[3ec149c] | 209 | fNodoXML(nivel,infonodo) donde: |
---|
| 210 | - nivel es el nivel de profundidad del nodo (en base 0) |
---|
[fc9a1ad] | 211 | - infonodo es toda la información contenida en el nodo. |
---|
[3ec149c] | 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 | /*------------------------------------------------------------------------------------------------ |
---|
[fc9a1ad] | 231 | Elimina un atributo de la información del nodo |
---|
[3ec149c] | 232 | Parametros: |
---|
| 233 | - nombreatributo:El nombre del atributo |
---|
[fc9a1ad] | 234 | - info: La información del Nodo |
---|
[3ec149c] | 235 | ------------------------------------------------------------------------------------------------*/ |
---|
| 236 | function EliminaAtributo($nombreatributo,$info){ |
---|
| 237 | $nada=""; |
---|
[294f9e5] | 238 | return($this->TomaAtributo($nombreatributo,$nada,$info,true)); |
---|
[3ec149c] | 239 | } |
---|
| 240 | /*------------------------------------------------------------------------------------------------ |
---|
[fc9a1ad] | 241 | Recupera el valor del atributo y lo elimina de la información del nodo |
---|
[3ec149c] | 242 | Parametros: |
---|
| 243 | - nombreatributo:El nombre del atributo |
---|
[fc9a1ad] | 244 | - puntero: Referencia a la variable que contendrá el valor del atributo |
---|
| 245 | - info: La información del Nodo |
---|
[3ec149c] | 246 | ------------------------------------------------------------------------------------------------*/ |
---|
| 247 | function TomaAtributoEspecial($nombreatributo,&$puntero,$info){ |
---|
[294f9e5] | 248 | return($this->TomaAtributo($nombreatributo,$puntero,$info,true)); |
---|
[3ec149c] | 249 | } |
---|
| 250 | /*------------------------------------------------------------------------------------------------ |
---|
| 251 | Recupera el valor del atributo |
---|
| 252 | Parametros: |
---|
| 253 | - nombreatributo:El nombre del atributo |
---|
[fc9a1ad] | 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 |
---|
[3ec149c] | 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 |
---|
[fc9a1ad] | 267 | $posa=$pos; // Primera posición del valor del atributo |
---|
[3ec149c] | 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 |
---|
[fc9a1ad] | 278 | $info=str_replace($strAtributo.$valoratributo,"",$info); // Elimina el atributo de la información |
---|
[3ec149c] | 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 | ?> |
---|