Bonjour à tous.

Je suis assez nouveau en C, s'il vous plaît, soyez indulgent.
J'ai fait de nombreuses recherches dans le but d'annihiler mon problème, sans résultat. J'espère que vous pourrez m'apporter votre aide.

Voici mon probleme:
Dans un programme, je dois parser des fichiers XML. Jusqu'à maintenant, j'ai utilisé le parser DOM car les fichiers étaient peu volumineux.
Aujourd'hui, je suis confronté à un XML de plus de 60 MO.
Je compte donc utiliser le parser SAX.

J'ai réussi à trouver des exemples qui m'ont permis de construire un petit parser sax fonctionnel, dont voici le code:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <Riostream.h>
#include <TList.h>
#include <TSAXParser.h>
#include <TXMLAttr.h>
class SaxHandler {
public:
   SaxHandler() { }
 
   void     OnStartDocument() { }
   void     OnEndDocument();
   void     OnStartElement(const char*, const TList*);
   void     OnEndElement(const char*);
   void     OnCharacters(const char*);
   void     OnComment(const char*);
   void     OnWarning(const char*);
   void     OnError(const char*);
   void     OnFatalError(const char*);
   void     OnCdataBlock(const char*, Int_t);
};
 
void SaxHandler::OnEndDocument()
{
   cout << endl;
}
 
void SaxHandler::OnStartElement(const char *name, const TList *attributes)
{
   cout << "<" << name;
 
   TXMLAttr *attr;
 
   TIter next(attributes);
   while ((attr = (TXMLAttr*) next())) {
      cout << " " << attr->GetName() << "=\"" << attr->GetValue() << "\"";
   }
 
   cout  << ">";
}
 
void SaxHandler::OnEndElement(const char *name)
{
   cout << "</" << name << ">";
}
 
void SaxHandler::OnCharacters(const char *characters)
{
   cout << characters;
}
 
void SaxHandler::OnComment(const char *text)
{
   cout << "<!--" << text << "-->";
}
 
void SaxHandler::OnWarning(const char *text)
{
   cout << "Warning: " << text << endl;
}
 
void SaxHandler::OnError(const char *text)
{
   cerr << "Error: " << text << endl ;
}
 
void SaxHandler::OnFatalError(const char *text)
{
   cerr << "FatalError: " << text << endl ;
}
 
void SaxHandler::OnCdataBlock(const char *text, Int_t len)
{
   cout << "OnCdataBlock() " << text;
}
 
 
 
void SAXHandler()
{
   TSAXParser *saxParser = new TSAXParser();
   SaxHandler *saxHandler = new SaxHandler();
 
   saxParser->ConnectToHandler("SaxHandler", saxHandler);
   saxParser->ParseFile("monfichier.xml");
}
Cependant, ces lignes lisent l'intégralité du fichier XML et ne récupèrent aucune valeur. J'aimerais récupérer des attributs situés dans certains noeuds spécifiques sans mettre en mémoire tout mon fichier XML. Est-ce possible ? Si oui, pouvez-vous m'aider ?


Je vous remercie par avance,

Froztiz