martes, 22 de marzo de 2016
Convertir XML a Hash en Harbour ( Update III )
Durante estos días, he estado trabajando con diversos XML , con formatos distintos, y he tenido que adaptar la funcion NodeToHash(), que corrige 2 incidencias graves;
La primera, se debía a que los atributos eran sobreescritos , no creando nuevos.
Ejemplo;
<test tipo="1">
<test tipo="2">
Esto ocasionaba que el tipo con "1" no estaba disponible.
La segunda, es un error de la funcion mxmlWalkNext( node, node, MXML_DESCEND )
Esta función , ante un elemento del tipo <tag> </tag> , es decir, un nodo tag con un valor de espacios
en blanco, ocasiona que devuelve que tiene un nodo, siendo esto incorrecto.
La solución parcial, es que si el nodo hijo devuelve un hash vacío , no se va a tener en cuenta a la hora de crear un array de hash.
He decir que esta poniendose a prueba con cientos de miles de peticiones, y la verdad es que va
fino, fino ;-)
STATIC FUNCTION NodeToHash( node )
Local hNext
Local hHashChild := {=>}
Local hHash := {=>}
WHILE node != NIL
IF mxmlGetType( node ) == MXML_ELEMENT
if HB_HHASKEY( hHash, mxmlGetElement( node ) )
if valtype( hHash[ mxmlGetElement( node ) ] ) <> "A"
hHash[ mxmlGetElement( node ) ] := mxmlGetOpaque( node )
else
// Es un array, por lo tanto, no lo tocamos
endif
else
hHash[ mxmlGetElement( node ) ] := mxmlGetOpaque( node )
endif
if empty( mxmlGetOpaque( node ) ) // Miramos dentro
hNext := mxmlWalkNext( node, node, MXML_DESCEND )
if hNext != NIL
hHashChild := NodeToHash( hNext )
// Correcion de Posible bug. Un elemento con espacios en blanco, deja descender un nivel!, cuando no debería!
// example <element> </element>
if hHashChild != NIL .and. !empty( hHashChild )
if empty( hHash[ mxmlGetElement( node ) ] )
hHash[ mxmlGetElement( node ) ] := {}
endif
if HB_MXMLGETATTRSCOUNT( node ) > 0
hHashChild[ mxmlGetElement( node ) + "@attr"] := HB_MXMLGETATTRS( node )
endif
AADD( hHash[ mxmlGetElement( node ) ], hHashChild )
endif
endif
else
if HB_MXMLGETATTRSCOUNT( node ) > 0
hHash[ mxmlGetElement( node ) + "@attr"] := HB_MXMLGETATTRS( node )
endif
endif
ENDIF
node := mxmlGetNextSibling( node )
END WHILE
return hHash
Suscribirse a:
Enviar comentarios (Atom)
Android y Git. Disponer del hash automáticamente.
Una de las cosas a las que estoy acostumbrado, es tener siempre en mi código, el hash/tag/versión del control de versiones que estoy usan...
-
Después de más de 2 años, sacrificando fin de semanas y tiempo libre, he podido pasar a una versión totalmente funcional. El Sofware es ca...
-
Os muestro un pequeño video de las posibilidades de Harbour funcioanando como un servidor Web. Dentro de /contrib/httpd, tenéis un serv...
-
Voy a publicar una serie de post sobre las funciones de threads que espero os sirva para comprender como podeis sacar provecho a ...
No hay comentarios:
Publicar un comentario