Récupérer un noeud spécifique avec SAX libxml2
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:
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