opengnsys/admin/WebConsole/clases/XmlPhp.php

285 lines
12 KiB
PHP

<?
/*================================================================================
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
?>