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:
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 ?
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"); }
Je vous remercie par avance,
Froztiz
Partager