summaryrefslogtreecommitdiffstats
path: root/admin/WebConsole/clases/XmlPhp.php
diff options
context:
space:
mode:
authorramon <ramongomez@us.es>2009-10-29 10:39:24 +0000
committerramon <ramongomez@us.es>2009-10-29 10:39:24 +0000
commit1b9262949ad2e32b4a82338d45fb4b6e5b293fba (patch)
tree3aee6892f32251570b996f7321a06980588cbc1e /admin/WebConsole/clases/XmlPhp.php
parentafcf2a19aa44ea6d03e02abd05b6f2938d687225 (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.php285
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