[bibliothèque C++] XmlFile

shadosan Message lu Posté le 17 Déc 2007 à 19:53 Bulle
Avatar de shadosan
Explorateur

Messages : 194
GCPoints : 8461
Bonjour,

Je suis en train de développer une bibliothèque de gestion de fichier XML, codé en C++ !

Qu'est-ce que le XML ?

le XML permet d'organiser ses données, sous forme de balises (nommé élément), qui peux avoir le nom que vous voulez. Ces éléments peuvent à leur tour contenir d'autres éléments, et ainsi de suite, et chaque élément peuvent contenir des données ou information, si vous voulez.

un petit exemple de fichier XML conforme :

Code :
<?xml version="1.0" encoding="ISO-8859-1"?>

<programme numero="0">
	<nom>Kiroxx 1.0a</nom>
	<info>il est pas fiable :-P</info>
	<auteur>
		<nom>Kevin</nom>
		<age>14</age>
	</auteur>
</programme>


La bibliothèque contiendra une petite documentation et quelques exemples pour se familiariser avec elle :-)

Je l'ai presque fini, il me reste que la gestion du chargement des fichiers à faire ^^ (autrement dit, 5% restant)

Je vous en reparle bientôt !

EDIT : Voilà, j'ai *enfin* fini la version 1.0; vous pouvez la trouver sur mon site :

http://open-maker.tuxfamily.org/

(lisez la news, tiens :-P)
Dernière édition le 26 Jan 2008 à 01:15
stilobique Message lu Posté le 17 Déc 2007 à 20:01 Bulle
Avatar de stilobique
Newser

Messages : 2387
GCPoints : 841900
Coder avec qu'elle langage et bibliothèque ? Et surtout euh... on peut l'utiliser pour quoi ??

(___/)
(='.'= )Voici Lapin. Copiez et collez Lapin dans votre signature
(")_(") pour l'aider à concrétiser sa domination du monde.
shadosan Message lu Posté le 17 Déc 2007 à 20:18 Bulle
Avatar de shadosan
Explorateur

Messages : 194
GCPoints : 8461
ah ouais, j'ai oublié de préciser qu'il est codé en c++, avec la bibliothèque standard (std).

on l'utilise d'habitude pour organiser dans un fichier (ou seulement dans la mémoire) des informations pour un programme, ou un site web qui en aurais de besoin...
Daru13 Message lu Posté le 17 Déc 2007 à 20:25 Bulle
Avatar de Daru13
Membre Elite

Messages : 2884
GCPoints : 108090
ça a l'air sympa :smile: .
stilobique Message lu Posté le 17 Déc 2007 à 20:31 Bulle
Avatar de stilobique
Newser

Messages : 2387
GCPoints : 841900
C'est assez intéressant, on peut donc rapidement mettre en place un moyen pour créer un fichier XML de sauvegarde pour un jeu par exemple (corrige si je me trompe :yes: ).

(___/)
(='.'= )Voici Lapin. Copiez et collez Lapin dans votre signature
(")_(") pour l'aider à concrétiser sa domination du monde.
shadosan Message lu Posté le 17 Déc 2007 à 20:43 Bulle
Avatar de shadosan
Explorateur

Messages : 194
GCPoints : 8461
ouep c'est ça :proud:

sauvegarder ses maps, les info de joueurs, les highscores, l'alignement des menus dans une interface comme Wxwidget, Qt ou autre, permettre à un programme d'être multi-language sans recompiler à chaque fois, et j'en passe (tout reste au choix du programmeur)
Darktib Message lu Posté le 17 Déc 2007 à 20:54 Bulle
Avatar de Darktib
Membre Ultime

Messages : 4017
GCPoints : 347288
Elle a l'air sympa ta bibliotheque. Ca pourra m'etre utile dans mon jeu ^^

Le xml c'est pratique, mais quelles sont les performances de ta bibliotheque?
stilobique Message lu Posté le 17 Déc 2007 à 20:59 Bulle
Avatar de stilobique
Newser

Messages : 2387
GCPoints : 841900
Petite question, la bibliothèque standard sa correspond à quoi ? Parce que si il s'agit des DLL de Windows cela signifie que ce n'est pas portable...

(___/)
(='.'= )Voici Lapin. Copiez et collez Lapin dans votre signature
(")_(") pour l'aider à concrétiser sa domination du monde.
Darktib Message lu Posté le 17 Déc 2007 à 21:00 Bulle
Avatar de Darktib
Membre Ultime

Messages : 4017
GCPoints : 347288
La bibliotheque standard std est multi-plateforme.
Ce n'est pas une dll windows.
shadosan Message lu Posté le 17 Déc 2007 à 21:03 Bulle
Avatar de shadosan
Explorateur

Messages : 194
GCPoints : 8461
je testerai ça quand je l'aurai fini, avec un fichier xml de plusieur Mo, que je vais créer de toute pièce.

Mais ça m'étonnerais pas qu'elle est des perf correct...
Darktib Message lu Posté le 17 Déc 2007 à 21:06 Bulle
Avatar de Darktib
Membre Ultime

Messages : 4017
GCPoints : 347288
Le probleme du xml c'est que n'importe qui peut changer les infos qui sont dedans.
Et aussi voir les données.
stilobique Message lu Posté le 17 Déc 2007 à 21:07 Bulle
Avatar de stilobique
Newser

Messages : 2387
GCPoints : 841900
il doit être possible de crypter les données par la suite non ?

(___/)
(='.'= )Voici Lapin. Copiez et collez Lapin dans votre signature
(")_(") pour l'aider à concrétiser sa domination du monde.
Darktib Message lu Posté le 17 Déc 2007 à 21:15 Bulle
Avatar de Darktib
Membre Ultime

Messages : 4017
GCPoints : 347288
surement, mais dans ce cas la il faut décrypter le fichier, puis loader le xml.
Autrement dit c'est plus lent...
shadosan Message lu Posté le 17 Déc 2007 à 21:21 Bulle
Avatar de shadosan
Explorateur

Messages : 194
GCPoints : 8461

Citation :

surement, mais dans ce cas la il faut décrypter le fichier, puis loader le xml.
Autrement dit c'est plus lent...



on a rien sans rien ;-)

et puis, dans la création d'un jeu, je suis contre d'empêcher à l'utilisateur de modifier les fichiers du jeu, SAUF si c'est un jeu multijoueur, ou qui a des possibilité de multijoueur.
on pourrait dire "le bouclier attire l'épée", ou si vous voulez, "le fichier crypté attire le crackeur" :happy:
Dernière édition le 17 Déc 2007 à 21:23
Mod Message lu Posté le 17 Déc 2007 à 21:26 Bulle
Avatar de Mod
Webmaster

Messages : 4954
GCPoints : 2100823
C'est aussi un avantage : les données sont claires et nettes, et simples à éditer :).

[Edit] Cinq minutes pour écrire ce message et une réponse en plus ^^'.
Dernière édition le 17 Déc 2007 à 21:27
Darktib Message lu Posté le 17 Déc 2007 à 21:30 Bulle
Avatar de Darktib
Membre Ultime

Messages : 4017
GCPoints : 347288
Quand est-ce que tu mettra ta bibliotheque en ligne ?
Et au fait, c'est quoi son ptit nom ? :wink:
shadosan Message lu Posté le 17 Déc 2007 à 21:34 Bulle
Avatar de shadosan
Explorateur

Messages : 194
GCPoints : 8461
1. je sais pas trop, mais dans moins d'une semaine, si tout vas bien ;-)

2. XmlFile :happy: En fait c'est assez simple comme bibliothèque; c'est juste un fichier .cpp et un .h qui contient plusieurs classes, à inclure à son projet... (on pourrait presque ne pas appeller ça une bibliothèque, mais bon... c'est vous qui décidez ^^ )
shadosan Message lu Posté le 13 Jan 2008 à 22:42 Bulle
Avatar de shadosan
Explorateur

Messages : 194
GCPoints : 8461
comme vous vous en doutiez surement, j'ai pas beaucoup développer durant le temps des fêtes, et donc j'ai pris du retard. Par contre, vue que maintenant je n'ai plus de prétextes pour faire mon paresseux :proud: j'y travaille dessus !

j'ai amélioré les perfs de beaucoup; si avant ça prenait 4 min (!!!) charger en mémoire 90,000 éléments XMLien, maintenant ça prend ... 1 seconde et demi :cool:

quelques petit exemple d'utilisation du code (qui ne devrais pas changer d'ici la Release) :

pour charger un fichier XML en C++, il faut faire ceci :

Code :
XmlFile xfile("test.xml");


ou bien :

Code :
XmlFile xfile;

xfile << "test.xml";


ou bien :

Code :
XmlFile xfile;

xfile.load("test.xml");


NB : il n'accepte pas de fichier non-xml, et accepte les fichier xML, XmL, XMl, etc peu importe comment il est écrit.

pour sauvegarder le fichier :

Code :
XmlFile xfile;

xfile >> "test.xml";


ou bien :

Code :
XmlFile xfile;

xfile.save("test.xml");


vue que toute action fait sur une classe d'xml peut produire une exception de type std::string, c'est toujours bon d'entourer les commandes par un block "try catch" :

Code :
try {
	XmlFile xfile("test.xml");
	// mes autres trucs lié au xml
catch (std::string erreur) {
	std::cout << endl << erreur << endl;
}


mais vous n'etes pas obligé, si vous savez se que vous faites !

----------------------------------------

Mini-tutoriel express sur le XML

il faut savoir qu'un fichier XML est composé d'éléments, ayant chacun leur nom, et facultativement une valeur et une liste d'attribues (autant que vous voulez, même zéro) qui ont chacun un nom et une valeur.

un bref exemple :

Code :
<monElement unAttribue="valeur de l'attribue">ma valeur !!!!</monElement>


NB : les règles de nommage d'éléments ou d'attribue sont :

- peut contenir des lettres et des chiffres seulement(les espaces ne sont pas autorisés);
- ne doit pas commencer par un chiffre ou un caractère ponctué;
- ne doit pas commencer par "xml";
- attentif à la casse.


Un fichier XML doit avoir un seul élément "racine" (root). Tout autres éléments ajouté doivent être dedans l'élément principal. Il n'as de nom particulier à avoir, laissez aller votre imagination ^^

Ensuite, il faut savoir qu'un élément peux contenir autant d'éléments que vous voulez ! Eux-même pouvant contenir autant d'élément désiré, ad vitam aeternam.

Code :
<root>maValeur
	<note id="1" type="email" oui="non">
		<to>Tove
			<last_name>Dupuis</last_name>
			<job>tech</job>
		</to>
		<from>John</from>
		<heading>Reminder</heading>
		<body>Don't forget me this weekend!</body>
	</note>
</root>


Dans l'exemple, root contient seulement note, qui lui contient to, from, heading et body. to contient last_name et job.

Et voila, je crois avoir fait le tour du XML ! ^^ c'est pas vraiment compliqué, non ?

----------------------------------------

La bibliothèque contient 4 classes :

- XmlPath : s'occupe de s'assurer que le chemin, lors sur chargement ou de la sauvegarde, est valide.

- XmlAttribute : représente un attribue.

- XmlElement : représente un élément.

- XmlFile : représente un fichier XML. La classe hérite de XmlElement, donc XmlFile est aussi un élément (l'élément "racine", pour ainsi dire)

pour présenter XmlPath, je vais reprendre l'exemple fait un peu plus tôt :

Code :
XmlFile xfile("test.xml");


qui est, en passant, l'équivalent de :

Code :
XmlFile xfile(XmlPath("test.xml"));


et... ma foi, ya pas grand choses à dire sur XmlPath ^^ bien sur, on peux obtenir ou modifier le chemin qu'il contient.

pour présenter le reste en condensé, :proud: je vais commencer par un fichier vide :

Code :
XmlFile xfile;


on vas lui donner un nom personalisé (son nom par défaut est "root"). le nom n'est le nom du fichier, seulement le nom de l'élément principal :

Code :
xfile.setName("body");


on vas lui ajouter un élément, nommé "a", avec comme valeur "un petit lien !" :

Code :
xfile << XmlElement("a","un petit lien !");


NB: il y a une autre manière d'ajouter un élément, mais elle est plus longue à écrire, et porte à confusion :
Code :
xfile.addElement(XmlElement("a","un petit lien !"));


ensuite, on aimerais lui donner un attribue nommé "href" avec comme valeur "http://www.google.com" :

Code :
xfile["a"] << XmlAttribute("href","http://www.google.com");


NB: il y a une autre manière de chercher un élément (qui est aussi dispo pour chercher un attribue), et propose un avantage non négligeable (mais facultatif) qui est de pouvoir chercher le Xème élément / attribue ayant le nom donné !
Ici, je cherche le 1er élément ayant le nom "a" et je lui ajoute l'attribue (de la manière facultative, mais la manière proposé précédemment fonctionnerais) :

Code :
xfile.getElement("a",1).addAttribute(XmlAttribute("href","http://www.google.com"));

Code :
xfile.getElement("a",1) << XmlAttribute("href","http://www.google.com");


pour abréger, sauvegardont et voyont le résultat :

Code :
<body>
	<a href="http://www.google.com">un petit lien !</a>
</body>


:proud:

Je vous reviendrez avec la bibliothèque complété ! :want: :yes:

EDIT : et hop, 35.8 GCPoints !
Dernière édition le 14 Jan 2008 à 16:53
Daru13 Message lu Posté le 13 Jan 2008 à 23:13 Bulle
Avatar de Daru13
Membre Elite

Messages : 2884
GCPoints : 108090

Citation :

EDIT : et hop, 35.8 GCPoints !


Dès que j'ai vu ton message, je me suis tout de suite dit " T'ain combien de points y s'est raflé là !? :shocked: " :lol: .

Sinon j'ai pas tout lu, mais le XML ça sert à quoi en gros :astonished: ?
A creer ses propres balises ( style XHTML ) d'accord, mais dans quel but :question:

stilobique Message lu Posté le 13 Jan 2008 à 23:23 Bulle
Avatar de stilobique
Newser

Messages : 2387
GCPoints : 841900

Daru13 a écrit :

A creer ses propres balises ( style XHTML ) d'accord, mais dans quel but :question:

Justement, le but c'est toi qui te le fixe, sa permet par exemple de sauvegarder les données plutôt que dans une base de données, ou alors on peut écrire des coordonnées... bref on en fait se que l'on veut.

(___/)
(='.'= )Voici Lapin. Copiez et collez Lapin dans votre signature
(")_(") pour l'aider à concrétiser sa domination du monde.
Répondre
GameCorp - Site d'apprentissage et d'entraide à la création de jeux vidéo.
XHTML Valid 1.1 - Page générée en 0.0855 secondes