Page 1 of 5

[MODULE] GMXEXT_mod_xml

PostPosted: Thu Aug 15, 2013 12:17 pm
by brujoMX
Saludos chicos, traigo una nueva version del modulo que permite trabajar con ficheros xml. He reescrito el codigo, ahora es mas eficiente y facil de usar.
Ya no creo agregar nuevas funciones, solo corregire los bugs que surjan y tratare de compilar la version para Linux y Mac ,pues estoy interesado en otros modulos.

Ojala puedan probarla y reportarme los problemas que detecten.

GMXEXT_mod_xml v1.0.0

+ Añadida la constante XML_ALL_DOCUMENTS
Para usarse con la funcion XML_Unload, asi descargaremos todos los archivos previamente cargados.
+ Añadida funcion XML_CloneElement

GMXEXT_mod_xml.rar

Re: [MODULE] GMXEXT_mod_xml beta

PostPosted: Thu Aug 15, 2013 3:05 pm
by erkosone
Interesante, una pregunta, el modulo deja crear nuevos elementos? nuevos campos? eliminar elementos y campos?
Esto viene bien para muchas cosas.

Re: [MODULE] GMXEXT_mod_xml beta

PostPosted: Thu Aug 15, 2013 6:17 pm
by brujoMX
Hola erkosone en eso estoy, ahora las funciones que tiene son de lectura de campos y escritura pero solo en memoria.

Re: [MODULE] GMXEXT_mod_xml beta

PostPosted: Tue Aug 20, 2013 2:08 pm
by brujoMX
Hola, he agregado muchas funciones, pero me tope con un problema que no se como resolver de forma adecuada.
Pasa lo siguiente:

si tenemos un xml asi:
Code: Select all
<?xml version="1.0" ?>
<MyGame>
   <resolution width="320" height="240" bpp="8"/>
   <message>
      <es>Hola mundo!!!</es>
      <en>Hello world!!!</en>
      <it>italiano</it>
      <es>espanol</es>
   </message>
</MyGame>


para llegar al tag message, uso lo siguiente:

Code: Select all
XMLElement e;
.......
.......
XML_GetElement(&e, "MyGame.message");


si de ahi yo quiero borrar el tag "es" hago esto:

Code: Select all
XML_DeleteSon(&e, "es");
.....
.....
XML_SaveFile("copy.xml");


y funciona bien, lo borrar y guarda en disco y todo lindo, el problema es que el tag "es" esta repetido, que pasa si yo quiero borrar el segundo tag "es" y no el primero ?
No se me ocurre una forma elegante de hacerlo, habia pensado en usar algo como:

Code: Select all
XML_DeleteSon(&e, "es@2");


Asi el "@2" indicaria que queremos borrar el segundo tag que coincida con la cadena "es", o agregar un tercer parametro:

Code: Select all
XML_DeleteSon(&e, "es", 2);


Pero no se, alomejor tengo mal planteado el uso de paths, para obtener los elementos.

Alguna sugerencia??

Saludos!

Re: [MODULE] GMXEXT_mod_xml beta

PostPosted: Tue Aug 20, 2013 2:46 pm
by g1tp111ricard8
[quote="brujoMX"]Hola, he agregado muchas funciones, pero me tope con un problema que no se como resolver de forma adecuada.
Pasa lo siguiente:

si tenemos un xml asi:
Code: Select all
<?xml version="1.0" ?>
<MyGame>
   <resolution width="320" height="240" bpp="8"/>
   <message>
      <es>Hola mundo!!!</es>
      <en>Hello world!!!</en>
      <it>italiano</it>
      <es>espanol</es>
   </message>
</MyGame>


Para esta parte, seria bueno que usaras los atributos, para diferenciar del primer tag <es> del segundo. Por ejemplo:

Code: Select all
<?xml version="1.0" ?>
<MyGame>
   <resolution width="320" height="240" bpp="8"/>
   <message>
      <es category="grettings">Hola mundo!!!</es>
      <en category="grettings">Hello world!!!</en>
      <it category="language">italiano</it>
      <es category="language">espanol</es>
   </message>
</MyGame>


O separar los mensajes por su categoria. Por ejemplo:

Code: Select all
<?xml version="1.0" ?>
<MyGame>
   <resolution width="320" height="240" bpp="8"/>
   <message category="es">
      <grettings>Hola mundo!!!</grettings>
      <language>espanol</language>
   </message>
   <message category="en">
      <grettings>Hello world!!!</grettings>
   </message>
   <message category="it">
      <language>italiano</language>
   </message>
</MyGame>


Con esto, ya puedes buscar de una manera mas facil un elemento, sin tener que recurrir a hacer codigos de mas.

Saludos...

Re: [MODULE] GMXEXT_mod_xml beta

PostPosted: Tue Aug 20, 2013 3:21 pm
by CicTec
Hola brujoMX,

Primero felicidades por el modulo, muy buen aporte. :)

Sobre el problema, aun no he mirado mucho el tema XML, lo que puedo dar como sugerencia es respecto a lo que habeis mencionado.

1 - La solucion de ricard8 me parece la mejor si se utilizan atributos.
2 - Si no se utilizan atributos, la solucion mejor seria utilizar el 3° parametro, porque eso minimiza la lectura de la cadena del segundo, mejorando la velicidad interna de ejecucion de la funcion.

Re: [MODULE] GMXEXT_mod_xml beta

PostPosted: Tue Aug 20, 2013 10:59 pm
by brujoMX
Edite el hilo principal con una nueva beta, ojala puedan testearlo, aun tiene el problema de elementos con el mismo nombre.

Saludos!

Re: [MODULE] GMXEXT_mod_xml beta

PostPosted: Wed Aug 21, 2013 9:41 am
by CicTec
Hola brujoMX,

He probado la lib y parece funcionar bien, te voy a dar mis sugerencias para la implementacion que quieres mejorar.

- XML_LoadFile: Para que permita mas ficheros XML cargados te recomiendo utilizar un sistema de array dinamicos, en principio se alocaria un espacio suficiente, quizas para cargarne 16 que luego puede ser aumentado segun que valor tiene el contador interno de numero de fichero cargados (el limite lo estableces tu).
La funcion debe devolver 0, si el fichero no se pudo cargar, sino un ID de 1 adelante.
Te recomiendo tambien reusar slots, cuando descargas un fichero, el ID vuelve a ser disponible para el siguiente LOAD.

- XML_NoSon, seria mejor XML_HasSon.

- XML_DeleteSon, mejor que tenga 2 overloads:
* INT XML_DeleteSon(XMLElement *e)
* INT XML_DeleteSon(XMLElement *e, STRING son_name)
El primero puede aceptar el ID del elemento o la constante XML_ALL_ELEMENT.
Si se le pasa el ID, elimina el elemento y todos sus hijos, si se le pasa XML_ALL_ELEMENT, elimina todos los elementos y todos sus hijos correspondientes.
El segundo acepta tambien ID del elemento o la constante XML_ALL_ELEMENT.
Si se le pasa el ID, elimina el elemento y su hijo correspondiente a son_name, si se le pasa XML_ALL_ELEMENT, elimina todos los elementos y todos sus hijos correspondientes a son_name.

- XML_DeleteAllSons, se puede eliminar, tenido la funcion anterior ya no hace mas falta esta.

Lo demas tal cual lo tienes creo que de momiento esta bien.

Re: [MODULE] GMXEXT_mod_xml beta

PostPosted: Thu Aug 22, 2013 7:57 am
by brujoMX
Muchas gracias por las sugrencias CicTec, tengo una pregunta.
Estoy reescribiendo algunas cosas, como la posibilidad de cargar mas de un fichero, pero me surgio una duda a la hora de elegir la estructura de datos adecuada.
me recomiendas usar STL o me monto un sistema propio?

Re: [MODULE] GMXEXT_mod_xml beta

PostPosted: Thu Aug 22, 2013 8:33 am
by CicTec
De nada. :)

No no, olvida STL, solo relentiza, montate un simple sistema de array dinamicos proprio, es mas que suficiente.

Sobre el sistema de carga multificheros, hay que tener en cuenta de lo siguiente:
- Las funciones actuales, trabajan en los elementos del fichero cargado, con lo cual:
- O cambias la signature de las funciones para que acepten un parametro "xml_id" que identifica el fichero.
- O necesitas cambiar la funcion "XML_GetElement(XMLElement *e, STRING path)", para que sea del tipo "XML_GetElement(INT xml_id, XMLElement *e, STRING path), para que te devuelva el elemento del particular fichero.