Parser xml

Description

XtreML est un parseur XML de style DOM supportant l'Unicode,non validant,qui regroupe un ensemble d'outils pour la manipulation de document xml. il est assez léger pour être intégrer dans n'importe quel programme. vous trouverez dans le fichier zip, un fichier html d'aide.
fonctionalités:
-Chargement/Sauvegarde de fichier disque ou flux mémoire au format:UTF-8, UTF-16 big endian, UTF-16 little endian, UTF-32 big endian, UTF-32 little endian. avec ou sans BOM.
-Ajouter ou supprimer des élements xml.
-Ajouter un noeud et tout son arborescence issue d'un autre document.
-Rechercher un noeud suivant son nom et/ou un couple de "Nom/valeur".
.....

Source / Exemple :


// XtreMLParser.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "..\\..\\XtreMLParser.h"

int _tmain(int argc, _TCHAR* argv[])
{
 UTF16String  string; 
 
 /***************************************************************************** 

  • Premier exemple qui consiste à créer un document XML *
                                                                                                                                                          • /
XtreMLDocument document; XtreMLNODE *node,*_tmpnode; //avec 2 noeuds temporaires on peut créer n'importe quel type de document XML document.ProcessingAdd("xml version=\"1.0\" encoding=\"UTF-8\"");// on ajoute le prologue. node=document.NodeAdd("racine"); //node pointe sur la balise "racine" node=node->NodeAdd("Course"); //node pointe sur la balise "Course" node=node->NodeAdd("prix"); //node pointe sur la balise "prix" node->AttrAdd("name","DAX"); //on ajoute un attribut à "prix" node=node->NodeAdd("partants"); //node pointe sur la balise "partants" _tmpnode=node->NodeAdd("Cheval"); /* Comme il y a plusieurs élément à ajouter dans node, j'utilise une variable temporaire "_tmpnode" afin de garder la trace de la balise "partants" */ _tmpnode->AttrAdd("name","pure sky"); //on ajoute des attributs au noeud "Cheval" _tmpnode->AttrAdd("driver","Tomasoli"); _tmpnode->AttrAdd("propriétaire","Roulland"); _tmpnode=node->NodeAdd("Cheval"); // on ajoute une nouvelle balise "Cheval" _tmpnode->AttrAdd("name","Natice de Fresnay"); //on ajoute des attributs au noeud Cheval _tmpnode->AttrAdd("driver","Mlle Sasso M."); _tmpnode->AttrAdd("propriétaire","Pellegrino L.J"); _tmpnode=node->NodeAdd("Cheval"); // on ajoute une nouvelle balise "Cheval" _tmpnode->AttrAdd("name","Pegalas"); //on ajoute des attributs au noeud Cheval _tmpnode->AttrAdd("driver","Mlle Salque"); _tmpnode->AttrAdd("propriétaire","Mary"); node=node->GetContainer(); // on remonte d'un niveau c'est à dire sur la balise "prix" _tmpnode=node->NodeAdd("terrain"); //on crée la balise "terrain" _tmpnode->TextAdd("Bon"); //on ajoute du text /* je désire remonter au noeud racine, et au lieu d'appeler 2 fois la fonction "GetContainer", j'utilise la fonction FindNode*/ node=document.FindNode("racine"); node->NodeAdd("Parieur"); // sauvegarde du document; char lpBuffer[256]; GetCurrentDirectoryA(256,lpBuffer); //on récuperer le répertoire courant string=lpBuffer; string+="\\"; string+="Exemple_creation.xml"; //construction du nom complet du fichier de sortie document.SaveToFile((wchar_t*)string.w_str(),EncUTF8,true);// on enregistre le document au format UTF-8, avec le BOM /*****************************************************************************
  • Exemple 2 -chargement et recherche d'un noeud dans le fichier *
  • précédemment créer, le modifier et l'enregistrer dans un nouveau fichier*
                                                                                                                                                          • /
XtreMLDocument doc2; if(doc2.LoadFromFile((wchar_t*)string.w_str())) { node=doc2.FindNode("Cheval","name","Natice de Fresnay");/* recherche de la balise balise "Cheval" contenant l'attribut "name" et la valeur "Natice de Fresnay" */ if(node) { XtreMLATTRIBUTE *attr=node->FindAttr("name"); // l'attribut "name" if(attr) { attr->SetValue("Kojack"); // on modifie sa valeur } if((node=doc2.FindNode("Parieur"))!=NULL) // recherche de la balise "Parieur" { _tmpnode=node->NodeAdd("Personne"); _tmpnode=_tmpnode->NodeAdd("Nom"); _tmpnode->TextAdd("Durant"); _tmpnode=(_tmpnode->GetContainer())->NodeAdd("Prenom"); _tmpnode->TextAdd("Michaël"); _tmpnode=node->NodeAdd("Personne"); _tmpnode=_tmpnode->NodeAdd("Nom"); _tmpnode->TextAdd("Martin"); _tmpnode=(_tmpnode->GetContainer())->NodeAdd("Prenom"); _tmpnode->TextAdd("Pierre"); } //sauvegarde du fichier au de "Exemple_Modif.xml" string=lpBuffer; string+="\\"; string+="Exemple_Modif.xml"; doc2.SaveToFile((wchar_t*)string.w_str(),EncUTF8,true); } } doc2.Clear(); // effacement de tout le contenu de doc2 /*************************************************************************************************
  • Exemple 3 - Gestion de l'unicode *
  • *
                                                                                                                                                                                                  • /
node=doc2.NodeAdd("Language"); _tmpnode=node->NodeAdd("Arménien"); _tmpnode->TextAdd(L"Կրնամ ապակի ուտել եւ ինծի անհանգիստ չըներ."); _tmpnode=node->NodeAdd("Russe"); _tmpnode->TextAdd(L"Я могу есть стекло, оно мне не вредит."); _tmpnode=node->NodeAdd("Ukrainien"); _tmpnode->TextAdd(L"Я можу їсти шкло, й воно мені не пошкодить."); _tmpnode=node->NodeAdd("Géorgien"); _tmpnode->TextAdd(L"მინას ვჭამ და არა მტკივა."); _tmpnode=node->NodeAdd("Aménien"); _tmpnode->TextAdd(L"Կրնամ ապակի ուտել եւ ինծի անհանգիստ չըներ."); _tmpnode=node->NodeAdd("Albanais"); _tmpnode->TextAdd(L"Une mund të ha qelq dhe nuk më gjen GJE"); _tmpnode=node->NodeAdd("Turc"); _tmpnode->TextAdd(L"جام ييه بلورم بڭا ضررى طوقونمز"); _tmpnode=node->NodeAdd("Bangali"); _tmpnode->TextAdd(L"আমি কাঁচ খেতে পারি, তাতে আমার কোনো ক্ষতি হয় না"); _tmpnode=node->NodeAdd("Tamoul"); _tmpnode->TextAdd(L"நான் கண்ணாடி சாப்பிடுவேன், அதனால் எனக்கு ஒரு கேடும் வராது"); _tmpnode=node->NodeAdd("Maltais"); _tmpnode->TextAdd(L"il niekol Nista '-ħġieġ u ma jagħmilli xejn"); _tmpnode=node->NodeAdd("Chinois"); _tmpnode->TextAdd(L"我能吞下玻璃而不伤身体"); _tmpnode=node->NodeAdd("Japonais"); _tmpnode->TextAdd(L"私はガラスを食べられます.それは私を傷つけません"); _tmpnode=node->NodeAdd("Coréen"); _tmpnode->TextAdd(L"나는 유리 를 먹을 수 있어요. 그래도 아프지 않아요 그래도 아프지 않아요"); _tmpnode=node->NodeAdd("Lao"); _tmpnode->TextAdd(L"ຂອ້ຍກິນແກ້ວໄດ້ໂດຍທີ່ມັນບໍ່ໄດ້ເຮັດໃຫ້ຂອ້ຍເຈັບ."); _tmpnode=node->NodeAdd("Slovaque"); _tmpnode->TextAdd(L"Я могу есть стекло, оно мне не вредит."); // pour finir on va sauvegarder le fichier sous plusieurs format. UTF16String directory=lpBuffer; directory+=L"\\"; //sauvegarde au format UTF-8 avec BOM string="Langage_UTF8_BOM.xml"; string=directory+string; doc2.SaveToFile((wchar_t*)string.w_str(),EncUTF8,true); //sauvegarde au format UTF-8 sans BOM string="Langage_UTF8.xml"; string=directory+string; doc2.SaveToFile((wchar_t*)string.w_str(),EncUTF8,false); //sauvegarde au format UTF-16 big endian avec BOM string="Langage_UTF-16BE_BOM.xml"; string=directory+string; doc2.SaveToFile((wchar_t*)string.w_str(),EncUTF16BE,true); //sauvegarde au format UTF-16 big endian sans BOM string="Langage_UTF-16BE.xml"; string=directory+string; doc2.SaveToFile((wchar_t*)string.w_str(),EncUTF16BE,false); //sauvegarde au format UTF-16 little endian avec BOM string="Langage_UTF-16LE_BOM.xml"; string=directory+string; doc2.SaveToFile((wchar_t*)string.w_str(),EncUTF16LE,true); //sauvegarde au format UTF-16 little endian sans BOM string="Langage_UTF-16LE.xml"; string=directory+string; doc2.SaveToFile((wchar_t*)string.w_str(),EncUTF16LE,false); //sauvegarde au format UTF-32 big endian avec BOM string="Langage_UTF-32BE_BOM.xml"; string=directory+string; doc2.SaveToFile((wchar_t*)string.w_str(),EncUTF32BE,true); //sauvegarde au format UTF-32 little endian avec BOM string="Langage_UTF-32LE_BOM.xml"; string=directory+string; doc2.SaveToFile((wchar_t*)string.w_str(),EncUTF32LE,true); return 0; }

Conclusion :


j'attends vos remarques pour m'aider à améliorer XtreML, dans un premier temps mon souci est qu'il soit fonctionnel et par la suite je verrai pour l'optimisation.
n'hésitez pas à le tester afin de me donner votre avis.
je veillerais à ajouter des commentaires au code lors de la prochaine mise à jour.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.