Wanted : Parser XML avec bonnes propriétés

Wanted : Parser XML avec bonnes propriétés - C++ - Programmation

Marsh Posté le 21-09-2010 à 11:21:05    

Salut tout le monde,
 
J'ai un gros fichier XML à traiter (il ne rentrera pas au complet en mémoire). Je vais donc utiliser un parser de type SAX.
Je cherche un parser xml de type SAX ayant les propriétés suivantes:
 
-possibilité de s'arréter en plein milieu du parsing et reprendre plus tard
-possibilité de se placer à un endroit précis du fichier (fseek?) et continuer le parsing à partir de là (le but étant de pouvoir placer des pointeurs dans le fichier XML et naviguer efficacement à l'intérieur)
 
J'ai vu que Expat permettait de s'arréter en plein milieu du parsing et de reprendre plus tard mais je n'ai pas vu la possibilité de se placer à un endroit particulier du fichier pour pouvoir continuer le parsing à partir de là.
 
Connaissez-vous quelques parser XML qui ont ces propriétés ?

Reply

Marsh Posté le 21-09-2010 à 11:21:05   

Reply

Marsh Posté le 21-09-2010 à 13:02:22    

Je connais plutôt bien expat. Ce que vous voulez faire n'est pas clair:

Citation :

possibilité de se placer à un endroit précis du fichier (fseek?) et continuer le parsing à partir de là

De commencer le parsing?
Ou bien c'est de commencer le parsing, puis sauter un bout du fichier en cours?
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 21-09-2010 à 14:13:58    

Pour faire clair, mon fichier XML a 2 parties:
-Une partie "utile" contenant des informations.
-Une partie "indexing".
 
Dans la partie "indexing", je veux pouvoir mettre des informations d'indexing + un pointeur vers un élément correspondant dans la partie "utile".
 
Donc l'idée, c'est que lorsque l'on recherche une info dans le fichier, on saute direct à la partie "indexing".  
-On cherche l'élément... (parcours SAX classique)  
-On trouve l'élément, avec un attribut qui contient l'emplacement de l'élément correspondant dans la partie "utile".
-Enfin, on saute directement à l'endroit correspondant dans la partie utile, puis on commence à lire à partir de là pour lire l'élément correspondant (donc un autre parcours SAX classique).
 
Ce que je recherche donc, c'est une API qui ressemblerait à
-une callback startElement
-une callback endElement
-la possibilité de stopper/reprendre le traitement
-la possibilité de changer la position courante dans le fichier XML
 
Est-ce plus clair?
 
Note: Je ne peux pas faire ce travail autrement que dans un fichier XML (pas de DB par exemple). Je suis obligé d'analyser un XML existant, pour lequel je détermine moi-même la structure.
 
L'intérêt de la partie d'indexing est qu'elle prendra <5% de la taille totale du fichier, ce qui améliorera beaucoup les performances

Reply

Marsh Posté le 21-09-2010 à 15:25:54    

Pour faire cela, je pense qu'il ne faut pas laisser expat gérer l'input a partir du fichier, mais il faut que tu le gères toi même via XML_ParseBuffer.
J'ai déja fait ce genre de choses (parser un buffer pour que expat reconnaisse des entités prédéfinies et implicites ne figurant pas dans le fichier parsé, parser un buffer contenant une déclaration xml (pour l'encoding) pour un fichier externe sans déclaration, et dont l'encoding était différent de celui du fichier courant, ...)
C'est un peu loin dans mon souvenir, mais c'était une méthode qui marche.
Note: le code de l'encapsulation perl d'expat (ie qui fait des appels a la librairie expat), ecrit en xs (proche du C) contient aussi des exemple de code transposable intéressants en fin de fichier, comme XML_ParseDone. Voir ici: http://cpansearch.perl.org/src/CHO [...] t/Expat.xs
A+,


Message édité par gilou le 21-09-2010 à 15:44:18

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 21-09-2010 à 16:27:47    

Je n'avais pas vu qu'il y avait cette possibilité dans Expat et effectivement, ça me semble pas mal du tout.
 
Je vais y jeter un oeil, merci ;)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed