diff options
author | ramon <ramongomez@us.es> | 2009-10-29 10:39:24 +0000 |
---|---|---|
committer | ramon <ramongomez@us.es> | 2009-10-29 10:39:24 +0000 |
commit | 1b9262949ad2e32b4a82338d45fb4b6e5b293fba (patch) | |
tree | 3aee6892f32251570b996f7321a06980588cbc1e /admin/WebConsole/clases/XmlPhp.php | |
parent | afcf2a19aa44ea6d03e02abd05b6f2938d687225 (diff) |
Reorganización directorios OpenGNSys Admin.
git-svn-id: https://opengnsys.es/svn/trunk@455 a21b9725-9963-47de-94b9-378ad31fedc9
Diffstat (limited to 'admin/WebConsole/clases/XmlPhp.php')
-rw-r--r-- | admin/WebConsole/clases/XmlPhp.php | 285 |
1 files changed, 285 insertions, 0 deletions
diff --git a/admin/WebConsole/clases/XmlPhp.php b/admin/WebConsole/clases/XmlPhp.php new file mode 100644 index 00000000..190fe84a --- /dev/null +++ b/admin/WebConsole/clases/XmlPhp.php @@ -0,0 +1,285 @@ +<? +/*================================================================================ +Esta clase implementa funciones de utilidad para tratar ficheros XML + + Parametros del constructor: + fxml=Fichero XML que contiene los atributos de los nodos + fileocade=Indica si el dato anterior es un fichero o una variable con el contenido del árbol: + 0: Es una cadena + 1: Es un fichero + + Especificaciones: + Se le llama información del nodo al nombre del nodo + sus atributos eliminando los marcadores + de comienzo:"<" y fin:">" +================================================================================*/ +class XmlPhp{ + var $buffer; + var $nptr; + + Function XmlPhp($fxml,$fileocade){ // Constructor + if ($fileocade==0){ + $this->nptr=1; + $this->buffer=trim($fxml); + } + else{ + $tbuffer=filesize($fxml); // Calcula tamaño del fichero + if ($tbuffer>0){ // EL fichero tiene contenido + $fd=fopen($fxml, "r"); + $this->buffer=fread ($fd,$tbuffer); + fclose ($fd); + $this->nptr=1; + $this->buffer=trim($this->buffer); + } + } + $this->buffer=ereg_replace( "[\n\r\t]"," ", $this->buffer ); + } + /* ------------------------------------------------------------------------------------------- + Recupera la información del primer nodo (nodo raiz) del arbol.Devuelve false en caso de que + no tenga hijos o bien no exista documento XML que analizar. + ---------------------------------------------------------------------------------------------*/ + function InfoNodoRaiz(){ + if (!$this->NodoRaiz()) // No existe documento XML + return(false); + return($this->Infonodo()); + } + /* ------------------------------------------------------------------------------------------- + Establece el puntero de nodos al primer nodo del árbol (nodo raiz). Devuelve false en caso + de que no exista documento XML que analizar. + ---------------------------------------------------------------------------------------------*/ + function NodoRaiz(){ + if ($this->buffer==null) return(false); // No existe documento XML + $this->nptr=0; + while ($this->nptr<strlen($this->buffer)) + if ('<'==substr($this->buffer,$this->nptr++,1)) return(true); + return(false); + } + /* ------------------------------------------------------------------------------------------- + Recupera la información del primer nodo hijo del nodo actual. Devuelve false en caso de que + no tenga hijos o bien no exista documento XML que analizar. + ---------------------------------------------------------------------------------------------*/ + function InfoPrimerNodoHijo(){ + if (!$this->PrimerNodoHijo()) // No tiene hijos o no existe documento XML + return(false); + return($this->Infonodo()); + } + /* ------------------------------------------------------------------------------------------- + Establece el puntero de nodos al primer nodo hijo del nodo actual. Devuelve false en caso + de que no tenga hijos o bien no exista documento XML que analizar. + ---------------------------------------------------------------------------------------------*/ + function PrimerNodoHijo(){ + if ($this->buffer==null) return(false); // No existe documento XML + $gnptr=$this->nptr; + while ($this->nptr<strlen($this->buffer)) + if ('<'==substr($this->buffer,$this->nptr++,1)) break; + $lon=$this->nptr; + if ('/'==substr($this->buffer,$lon,1)){ // No tiene hijos + $this->nptr=$gnptr; + return(false); + } + return(true); + } + /* ------------------------------------------------------------------------------------------- + Recupera la información del siguiente nodo hermano del actual. Devuelve false en caso de que + el nodo actual sea el último de sus hermanos o bien no exista documento XML que analizar. + ---------------------------------------------------------------------------------------------*/ + function InfoSiguienteNodoHermano(){ + if (!$this->SiguienteNodoHermano()) // No tiene hermanos o no existe documento XML + return(false); + return($this->Infonodo()); + } + /* ------------------------------------------------------------------------------------------- + Establece el puntero de nodos al siguiente nodo hermano del nodo actual. Devuelve false en + caso de que el nodo actual sea el último de los hermanos o bien no exista documento XML que analizar. + ---------------------------------------------------------------------------------------------*/ + function SiguienteNodoHermano(){ + if ($this->buffer==null) return(false); // No existe documento XML + $gnptr=$this->nptr; + $resul=$this->_siguiente_hermano(); + if (!$resul){ + $this->nptr=$gnptr; // Es el último hermano + return(false); + } + return(true); + } + /* ------------------------------------------------------------------------------------------- + Establece el puntero de nodos al siguiente nodo hermano del actual + ---------------------------------------------------------------------------------------------*/ + function _siguiente_hermano(){ + $lon=$this->nptr; + $sw=1; + $nombrenodo=$this->NombreNodo(); + while (1){ + $lon = strpos($this->buffer,'<',++$lon); + if (substr($this->buffer,++$lon,1)=='/') + $sw--; + else + $sw++; + if ($sw==0){ + while ($lon<strlen($this->buffer)){ + if (substr($this->buffer,$lon++,1)=='<'){ + if (substr($this->buffer,$lon,1)=='/') + return(false); // Es el último hermano + else{ + $this->nptr=$lon; + return(true); + } + } + } + return(false); // Se trata del nodo raiz + } + } + } + /* ------------------------------------------------------------------------------------------- + Recupera el número de hijos del nodo actual + ---------------------------------------------------------------------------------------------*/ + function NumerodeHijos(){ + $gnptr=$this->nptr; + $nh=0; + if ($this->PrimerNodoHijo()){ + $nh++; + while ($this->SiguienteNodoHermano()) $nh++; + } + $this->nptr=$gnptr; + return($nh); + } + /* ------------------------------------------------------------------------------------------- + Devuelve true si el nodo es el último de sus hermanos + ---------------------------------------------------------------------------------------------*/ + function EsUltimoHermano(){ + $gnptr=$this->nptr; + if (!$this->SiguienteNodoHermano()){ + $this->nptr=$gnptr; + return(true); + } + $this->nptr=$gnptr; + return(false); + } + /* ------------------------------------------------------------------------------------------- + Devuelve los atributos del nodo. + Prámetros: + Si se aporta el puntero del nodo se devolverán los atributos del nodo apuntado + pero si no se especifican argumentos se devuelven los atributos del nodo actual. + ---------------------------------------------------------------------------------------------*/ + function Atributos($ptrnodo=-1){ + if ($ptrnodo!=-1) + $this->_setnodo($ptrnodo); + $atributosHTML=""; + $info=$this->Infonodo(); + $pos=strpos($info," "); + if ($pos) // El nodo tiene atributos + $atributosHTML=" ".substr($info,$pos); + return($atributosHTML); + } + /* ------------------------------------------------------------------------------------------- + Posiciona el puntero de nodos + ---------------------------------------------------------------------------------------------*/ + function _setnodo($ptrnodo){ + $this->nptr=$ptrnodo; + } + /* ------------------------------------------------------------------------------------------- + Devuelve el puntero del nodo actual + ---------------------------------------------------------------------------------------------*/ + function Nodo(){ + return($this->nptr); + } + /* ------------------------------------------------------------------------------------------- + Recupera el nombre del nodo + ---------------------------------------------------------------------------------------------*/ + function NombreNodo(){ + $infonodo=$this->Infonodo(); + $trozos=split(" ",$infonodo); + return ($trozos[0]); + } + /* ------------------------------------------------------------------------------------------- + Recupera la información del nodo actual + ---------------------------------------------------------------------------------------------*/ + function Infonodo(){ + if ($this->buffer==null) return(false); // No existe documento XML + $lon=$this->nptr; + while ($lon<strlen($this->buffer)) + if ('>'==substr($this->buffer,++$lon,1)) break; + $info=trim(substr($this->buffer,$this->nptr,$lon-$this->nptr)); + $info=str_replace("[","<",$info); + $info=str_replace("]",">",$info); + return $info; + } + /* ------------------------------------------------------------------------------------------- + Recorre el arbol de nodos del documento XML y para cada nodo genera un evento que se + puede capturar a través de una funcion que tiene esta forma: + fNodoXML(nivel,infonodo) donde: + - nivel es el nivel de profundidad del nodo (en base 0) + - infonodo es toda la información contenida en el nodo. + ---------------------------------------------------------------------------------------------*/ + function RecorreArboXML(){ + if (!$this->NodoRaiz()) return; // No existe documento XML que analizar + $this->_arbolXmlrecur(0); + } + // ------------------------------------------------------------------------------------- + // Recorrido recursivo del arbol XML + // ------------------------------------------------------------------------------------- + function _arbolXmlrecur($nivel){ + do{ + $infonodo=$this->Infonodo(); + fNodoXML($nivel,$infonodo); + $gnptr=$this->nptr; + if ($this->PrimerNodoHijo()) + $this->_arbolXmlrecur($nivel+1); + $this->nptr=$gnptr; + }while($this->SiguienteNodoHermano()); + } + /*------------------------------------------------------------------------------------------------ + Elimina un atributo de la información del nodo + Parametros: + - nombreatributo:El nombre del atributo + - info: La información del Nodo + ------------------------------------------------------------------------------------------------*/ + function EliminaAtributo($nombreatributo,$info){ + $nada=""; + return($this->TomaAtributo($nombreatributo,&$nada,$info,true)); + } + /*------------------------------------------------------------------------------------------------ + Recupera el valor del atributo y lo elimina de la información del nodo + Parametros: + - nombreatributo:El nombre del atributo + - puntero: Referencia a la variable que contendrá el valor del atributo + - info: La información del Nodo + ------------------------------------------------------------------------------------------------*/ + function TomaAtributoEspecial($nombreatributo,&$puntero,$info){ + return($this->TomaAtributo($nombreatributo,&$puntero,$info,true)); + } + /*------------------------------------------------------------------------------------------------ + Recupera el valor del atributo + Parametros: + - nombreatributo:El nombre del atributo + - puntero: Referencia a la variable que contendrá el valor del atributo + - info: La información del Nodo + - sw: Si vale true el atributo se eliminará de la información del nodo + ------------------------------------------------------------------------------------------------*/ + function TomaAtributo($nombreatributo,&$puntero,$info,$swkill=false){ + $doblescomillas='"'; + $strAtributo=" ".$nombreatributo."="; + $pos=strpos($info,$strAtributo); + if (!$pos){ + $puntero=null; + return($info); + } + $pos+=strlen($strAtributo); // Avanza hasta el signo igual + $posa=$pos; // Primera posición del valor del atributo + $swcomillas=false; + while ($pos<strlen($info)){ + if ($doblescomillas==substr($info,$pos,1)) $swcomillas=!$swcomillas; + if (' '==substr($info,$pos,1) || '> '==substr($info,$pos,1)) + if (!$swcomillas) break; + $pos++; + } + $posb=$pos; + $valoratributo=substr($info,$posa,$posb-$posa); + if ($swkill) // Eliminar el atributo de la la cadena + $info=str_replace($strAtributo.$valoratributo,"",$info); // Elimina el atributo de la información + if ($doblescomillas==substr($valoratributo,0,1)) // Elimina las comillas + $valoratributo=str_replace($doblescomillas,"",$valoratributo); + $puntero=$valoratributo; + return($info); + } +} // Fin de la clase +?>
\ No newline at end of file |