Amigos, quiero compartir con ustedes una peque帽a clase, que me esta
siendo muy 煤til, que nos va a permitir cargar desde un XML , atributo/valor, y podremos acceder a ellos a traves de una tabla de dispersi贸n, conocidas como Hash.
No se si existe algo similar a este invento en Harbour, o estoy
reinventando la rueda, pero que bien me lo paso
Asi, en vez de declarar un mont贸n de variables y cargarlas desde un XML,
podemos obviar eso, y poder usar una clase que nos permite tener que olvidarnos de eso, dando una mayor flexibilidad.
Digamos que podemos usar la clase TOptions como una extension de nuestras clases o funciones.
Nuestro XML de codificaci贸n de ejemplo;
Ahora , solamente nos queda como hacer uso de eso XML;
Espero les sea 煤til, es que en Delphi lo hacen de esta manera,
驴 como no vamos a hacerlo nosotros
?
C贸digo fuente de la clase, puedes ver lo simple que es;
siendo muy 煤til, que nos va a permitir cargar desde un XML , atributo/valor, y podremos acceder a ellos a traves de una tabla de dispersi贸n, conocidas como Hash.
No se si existe algo similar a este invento en Harbour, o estoy
reinventando la rueda, pero que bien me lo paso
Asi, en vez de declarar un mont贸n de variables y cargarlas desde un XML,
podemos obviar eso, y poder usar una clase que nos permite tener que olvidarnos de eso, dando una mayor flexibilidad.
Digamos que podemos usar la clase TOptions como una extension de nuestras clases o funciones.
Nuestro XML de codificaci贸n de ejemplo;
<values_default>
;Definicion de Cliente
<PARAM id="cliente" constante="dni" valor="122345" />
<PARAM id="cliente" constante="nombre" valor="Pepe Luis" />
;Definicion de Proveedor
<PARAM id="proveedor" constante="dni" valor="32115X" />
<PARAM id="proveedo" constante="nombre" valor="Manolo" />
</values_default>Ahora , solamente nos queda como hacer uso de eso XML;
op := TOptions():New( "fichero.xml" )
op:Load( "cliente" )
? op:Item["dni"] , op:Item["nombre"]
op:Load( "proveedor" )
? op:Item["dni"] , op:Item["nombre"]Espero les sea 煤til, es que en Delphi lo hacen de esta manera,
驴 como no vamos a hacerlo nosotros
C贸digo fuente de la clase, puedes ver lo simple que es;
#include "hbclass.ch"
#include "hbxml.ch"
Class TOptions
DATA oXmlDoc
DATA cOption
DATA Item
DATA cError, lError
DATA cRoot INIT "values_default"
DATA cFile
METHOD New( cFile )
METHOD Load( cOption )
End Class
METHOD New( cFile ) CLASS TOptions
::cFile := cFile
RETURN Self
METHOD Load( cOption ) CLASS TOptions
Local oNodo , oNodeChild
::Item := {=>} // Cada llamada , vamos a recargar el Hash
HSETCASEMATCH( ::iTem, .F. ) // No tengo en cuenta Upper/Lower
::oXmlDoc := TXmlDocument():New( Memoread( ::cFile ) )
if ::oXmlDoc:nStatus != HBXML_STATUS_OK
::cError := "Error While Processing File: " + AllTrim( Str( ::oXmlDoc:nLine ) ) + " # "+;
"Error: " + HB_XmlErrorDesc( ::oXmlDoc:nError ) + " # " +;
"Tag Error on tag: " + ::oXmlDoc:oErrorNode:cName + " # " +;
"Tag Begin on line: " + AllTrim( Str( ::oXmlDoc:oErrorNode:nBeginLine ) )
::lError := .T.
return nil
endif
if ( oNodo := ::oXmlDoc:FindFirst( ::cRoot ) ) != NIL
oNodeChild := oNodo:oChild
while oNodeChild != NIL
if UPPER( oNodeChild:GetAttribute("id") ) = UPPER( cOption )
::Item[ oNodeChild:GetAttribute("constante") ] := oNodeChild:GetAttribute("valor")
endif
oNodeChild := oNodeChild:oNext
end while
endif
RETURN NILSaludos
Rafa Carmona ( rafa.thefullARROBAgmail.com___quitalineas__)
Rafa Carmona ( rafa.thefullARROBAgmail.com___quitalineas__)