1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
|
<?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 __construct($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=preg_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.
Pará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=explode(" ",$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
?>
|