Page 4 of 5

Re: [MODULE] GMXEXT_mod_xml beta

PostPosted: Tue Aug 27, 2013 10:55 pm
by CicTec
De nada. ;)

Re: [MODULE] GMXEXT_mod_xml beta

PostPosted: Wed Aug 28, 2013 12:09 am
by brujoMX
para las funciones

INT XML_GetAttribute(XMLElement *e, STRING attribute, INT *v)
INT XML_GetAttribute(XMLElement *e, STRING attribute, FLOAT *v)
INT XML_GetAttribute(XMLElement *e, STRING attribute, STRING *v)

te parece bien que las deje asi con sus overloads o seria mejor hacer algo como:

INT XML_GetIntAttribute(XMLElement *e, STRING attribute)
FLOAT XML_GetFloatAttribute(XMLElement *e, STRING attribute)
STRING XML_GetStringAttribute(XMLElement *e, STRING attribute)

Re: [MODULE] GMXEXT_mod_xml beta

PostPosted: Wed Aug 28, 2013 4:15 am
by brujoMX
CicTec wrote:De nada. :)

Pues si ya el elemento tiene el ID del documento al cual pertenece ok, el problema es que si le pasa XML_ALL_ELEMENTS no se sabe a cual documento eliminar todos los elementos, por eso se necesita el parametro "document", sino debes eliminar la opcion XML_ALL_ELEMENTS

Yo haria asi:
INT XML_DeleteSon(INT document, XMLElement *e)
INT XML_DeleteSon(INT document, XMLElement *e, STRING son_name) -> (overload 1)


Con este uso:
Source Code (Gemix) [ Download ] [ Hide ]
  • xml_deleteson(document, eResolution); // elimino todos los hijos del elemento "eResolution" del documento "document"
  • xml_deleteson(document, eResolution, "blabla"); // elimino el hijo "blabla" del elemento "eResolution" del documento "document"
  • xml_deleteson(document, XML_ALL_ELEMENTS); // elimino todos los elementos y hijos del documento "document"
  • xml_deleteson(document, XML_ALL_ELEMENTS, "blabla"); // elimino todos los hijos "blabla" de todos los elementos del documento "document"
  •  


Por cierto, para poder pasar XML_ALL_ELEMENTS al parametro "XMLElement *e", esta debe tener el valor 0, sino el compilador dara error en la llamada, mientra como 0 seria interpretado como si se pasase "null" o un puntero nulo y internamente lo puedes tratar como caso especial.


Si mira, los 2 primeros XML_DeleteSon no necesitan pasar el document, pues ya va incluido en el elemento que se le pasa por parametro.
Las otras 2 overloads las voy a implementar muchas gracias por la sugerencia, solo que no entendi nada eso que me dijiste de la constante XML_ALL_ELEMENTS, me puedes explicar con un poco mas de detalle?

Re: [MODULE] GMXEXT_mod_xml beta

PostPosted: Wed Aug 28, 2013 9:02 am
by CicTec
brujoMX wrote:para las funciones

INT XML_GetAttribute(XMLElement *e, STRING attribute, INT *v)
INT XML_GetAttribute(XMLElement *e, STRING attribute, FLOAT *v)
INT XML_GetAttribute(XMLElement *e, STRING attribute, STRING *v)

te parece bien que las deje asi con sus overloads o seria mejor hacer algo como:

INT XML_GetIntAttribute(XMLElement *e, STRING attribute)
FLOAT XML_GetFloatAttribute(XMLElement *e, STRING attribute)
STRING XML_GetStringAttribute(XMLElement *e, STRING attribute)

Yo lo haria asi:
Una nueva funcion:
INT XML_GetAttributeType(XMLElement, STRING attribute_name)
Esta funcion devolveria:
- XML_ERROR (0) en caso de error
- XML_ATTRIBUTE_INT (1) si el attributo es de tipo INT
- XML_ATTRIBUTE_FLOAT (2) si el attributo es de tipo FLOAT
- XML_ATTRIBUTE_STRING (3) si el attributo es de tipo STRING

Y la funcion XML_GetAttribute asi:
INT XML_GetAttribute(XMLElement *e, STRING attribute, INT attribute_type, VOID *v)

Asi podria haber en el programa:
Source Code (Gemix) [ Download ] [ Hide ]
  • attrtype = XML_GetAttributeType(&eActorPosition, "x");
  • XML_GetAttribute(&eActorPosition, "x", attrtype, &var);
  •  

Esto puede ser util si sequieren crear editors para crear o editar XML de terceros, donde no se conocen los tipos de attributos.

Si te parece complicado entonces dejaria asi:
INT XML_GetAttribute(XMLElement *e, STRING attribute, INT *v)
INT XML_GetAttribute(XMLElement *e, STRING attribute, FLOAT *v)
INT XML_GetAttribute(XMLElement *e, STRING attribute, STRING *v)


brujoMX wrote:
CicTec wrote:De nada. :)

Pues si ya el elemento tiene el ID del documento al cual pertenece ok, el problema es que si le pasa XML_ALL_ELEMENTS no se sabe a cual documento eliminar todos los elementos, por eso se necesita el parametro "document", sino debes eliminar la opcion XML_ALL_ELEMENTS

Yo haria asi:
INT XML_DeleteSon(INT document, XMLElement *e)
INT XML_DeleteSon(INT document, XMLElement *e, STRING son_name) -> (overload 1)


Con este uso:
Source Code (Gemix) [ Download ] [ Hide ]
  • xml_deleteson(document, eResolution); // elimino todos los hijos del elemento "eResolution" del documento "document"
  • xml_deleteson(document, eResolution, "blabla"); // elimino el hijo "blabla" del elemento "eResolution" del documento "document"
  • xml_deleteson(document, XML_ALL_ELEMENTS); // elimino todos los elementos y hijos del documento "document"
  • xml_deleteson(document, XML_ALL_ELEMENTS, "blabla"); // elimino todos los hijos "blabla" de todos los elementos del documento "document"
  •  


Por cierto, para poder pasar XML_ALL_ELEMENTS al parametro "XMLElement *e", esta debe tener el valor 0, sino el compilador dara error en la llamada, mientra como 0 seria interpretado como si se pasase "null" o un puntero nulo y internamente lo puedes tratar como caso especial.


Si mira, los 2 primeros XML_DeleteSon no necesitan pasar el document, pues ya va incluido en el elemento que se le pasa por parametro.
Las otras 2 overloads las voy a implementar muchas gracias por la sugerencia, solo que no entendi nada eso que me dijiste de la constante XML_ALL_ELEMENTS, me puedes explicar con un poco mas de detalle?

Si, imagina de tener un XML con varios elementos, el parametro XML_ALL_ELEMENTS permite eliminar todos los elementos (como vaciar el XML vamos).
Si ademas usas la version con el parametro son y tienes un XML con varios elementos que tengan el mismo hijo con el mismo nombre, pues eliminaria todos esos hijos.

El problema de XML_ALL_ELEMENTS es que es una constante, cuando a la funcion pasas un puntero a un dato XMLElement, esto contiene internamente el ID del documento al cual pertenece. Todavia pasando la constante no hay esa informacion disponible, por ende la funcion no sabe a cual documento aplicar la accion (porque puede haber mas documentos cargados). Por esa razon sirve el parametro "INT document", que inclueria en todos los overloads. Viceversa no se podria usar la opcion XML_ALL_ELEMENTS.

Re: [MODULE] GMXEXT_mod_xml beta

PostPosted: Wed Sep 04, 2013 10:45 pm
by brujoMX
Edite el post principal, ojala puedan probarla y les funcione.

Saludos!

Re: [MODULE] GMXEXT_mod_xml beta

PostPosted: Thu Sep 05, 2013 8:32 pm
by CicTec
Hola brujoMX,

La baje, a ver si a la tarde o maƱana la puedo probar y te dare mi opinion.

Re: [MODULE] GMXEXT_mod_xml

PostPosted: Sat Sep 07, 2013 7:29 pm
by CicTec
Hola brujoMX,

Probe la ultima version y parece funcionar bien.

En mi opinion sigue un poco limitado con el tema del manejo de documentos multiples y el manejo de los elementos del mismo, aunque sumariamiente esta bien.

Ahora seria importante el porting a otras plataformas.

Muy buen aporte.

Re: [MODULE] GMXEXT_mod_xml

PostPosted: Sat Sep 07, 2013 7:45 pm
by brujoMX
Hola CicTec, me podrias decir a que te refieres con que esta limitado con el uso de multiples documentos?, pues puedes cargar N documentos sin problemas.

saludos!

Re: [MODULE] GMXEXT_mod_xml

PostPosted: Sat Sep 07, 2013 8:02 pm
by CicTec
Digamos que si quieres eliminar los elementos de un documento, debes hacerlo uno a la vez, no puedes por ejemplo hacer toda la operacion con una unica llamada de funcion, o incluso descargar todos los documentos cargardos con una sola llamada.

Re: [MODULE] GMXEXT_mod_xml

PostPosted: Sat Sep 07, 2013 8:15 pm
by brujoMX
si puedes eliminar todos los elementos del documento con una sola llamada

Code: Select all
root = XML_GetRootElement(document);
XML_DeleteElement(root, XML_ALL_ELEMENTS);

Bueno fueros dos llamadas.
Lo de descargar todos los documentos tienes razon, no hice alguna funcion para eso, la agregare.

Gracias Cictec.