Un parsingur XML léger efficace pour les gros fichiers?

J’ai besoin d’parsingr des fichiers XML potentiellement énormes, alors je suppose que cela exclut les parsingurs DOM.

Existe-t-il un bon parsingur SAX léger pour C ++, comparable à TinyXML en termes d’empreinte? La structure de XML est très simple, aucun élément avancé tel que les espaces de noms et les DTD n’est nécessaire. Juste des éléments, des atsortingbuts et des cdata.

Je connais Xerces, mais sa taille de plus de 50 Mo me donne des frissons.

Merci!

Si vous utilisez C, vous pouvez utiliser LibXML à partir du projet Gnome . Vous pouvez choisir parmi les interfaces DOM et SAX de votre document, ainsi que de nombreuses fonctionnalités supplémentaires développées au fil des années. Si vous voulez vraiment C ++, vous pouvez utiliser libxml ++ , qui est un wrapper C ++ autour de LibXML.

La bibliothèque a fait ses preuves encore et encore, est très performante et peut être compilée sur presque toutes les plateformes disponibles.

J’aime ExPat
http://expat.sourceforge.net/

Il est basé sur le C mais plusieurs wrappers C ++ sont disponibles pour vous aider.

RapidXML est un parsingur assez rapide pour XML écrit en C ++.

http://sourceforge.net/projects/wsdlpull c’est un portage c ++ simple de l’API java xmlpull ( http://www.xmlpull.org/ )

Je recommande fortement cet parsingur. Je devais le personnaliser pour l’utiliser sur mon appareil intégré (pas de support STL), mais je l’ai trouvé très rapide avec très peu de temps système. Je devais créer mes propres classes de chaînes et de vecteurs, et même avec celles-ci, elles compilaient environ 60 000 fenêtres.

Je pense que l’parsing par extraction est beaucoup plus intuitive que quelque chose comme SAX. Le code reflète beaucoup plus étroitement le document XML, ce qui facilite la corrélation entre les deux.

Le seul inconvénient est que c’est uniquement en avant, ce qui signifie que vous devez parsingr les éléments au fur et à mesure. Nous avons une conception assez confuse pour la lecture de nos fichiers de configuration, et je dois parsingr un sous-arbre entier, effectuer des vérifications, puis définir des valeurs par défaut, puis réparsingr. Avec cet parsingur, le seul moyen de gérer quelque chose comme ça est de faire une copie de l’état, d’parsingr avec cela, puis de continuer avec l’original. Il finit toujours par être une grande victoire en termes de ressources par rapport à notre ancien parsingur DOM.

Si votre structure XML est très simple, vous pouvez envisager de construire un simple lexer / scanner basé sur lex / yacc (flex / bison). Les sources du W3C peuvent vous inspirer: http://www.w3.org/XML/9707/parser.y et http://www.w3.org/XML/9707/scanner.l .

Voir aussi l’ interface SAX2 dans libxml

CMarkup de firstobject est une classe C ++ qui fonctionne comme un parsingur Pull Pull de fichiers très léger (je recommande un parsingur Pull plutôt que SAX) et un très gros graveur de fichier XML. Cela représente environ 250 Ko pour votre exécutable. Lorsqu’il est utilisé en mémoire, il a 1/3 de l’empreinte de tinyxml selon le rapport d’un utilisateur. Lorsqu’il est utilisé sur un fichier volumineux, il ne contient qu’un petit tampon (environ 16 Ko) en mémoire. CMarkup étant actuellement un produit commercial, il est pris en charge, documenté et conçu pour être facile à append à votre projet avec un seul fichier cpp et h.

Le moyen le plus simple de l’essayer est d’utiliser un script dans l’éditeur XML gratuit firstobject, tel que celui-ci:

  ParseHugeXmlFile ()
 {
   CMarkup xml;
   xml.Open ("HugeFile.xml", MDF_READFILE);
   while (xml.FindElem ("// record"))
   {
     // enregistrement de processus ...
     str sRecordId = xml.GetAtsortingb ("id");
     xml.IntoElem ();
     xml.FindElem ("description");
     str sDescription = xml.GetData ();
   }
   xml.Close ();
 } 

Dans le menu Fichier, sélectionnez Nouveau programme, collez-le et modifiez-le pour vos éléments et atsortingbuts, appuyez sur F9 pour l’exécuter ou sur F10 pour le parcourir ligne par ligne.

vous pouvez essayer http://die-xml.googlecode.com/ . il semble être très petit et facile à utiliser

ceci est un open source de l’parsingur SAX C ++ 0x XML récemment fait et l’auteur est prêt à faire des commentaires

il parsing un stream d’entrée et génère des événements sur les rappels compatibles avec std :: function

la machine à stack utilise des automates finis en tant que backend et certains événements (balises de début et nœuds de texte) utilisent des iterators afin de minimiser la mise en mémoire tampon, ce qui la rend assez légère

Je regarderais des outils qui génèrent un parsingur spécifique à la DTD / schéma si vous voulez petit et rapide. Celles-ci sont très bonnes pour les gros documents.

Je recommande fortement pugixml

pugixml est une bibliothèque de traitement XML légère en C ++.

“pugixml est une bibliothèque de traitement XML C ++, qui consiste en une interface de type DOM avec de riches capacités de traversée / modification, un parsingur XML extrêmement rapide qui construit l’arborescence DOM à partir d’un fichier / tampon XML et une implémentation XPath 1.0 pour les données complexes. Un support complet Unicode est également disponible, avec les variantes d’interface Unicode et les conversions entre différents codages Unicode. “

J’ai testé quelques parsingurs XML, dont certains coûteux, avant de choisir et d’utiliser pugixml dans un produit commercial.

pugixml était non seulement l’parsingur le plus rapide, mais également l’API la plus mature et la plus conviviale. Je le recommande fortement. C’est un produit très stable! J’ai commencé à l’utiliser depuis la version 0.8. Maintenant, c’est 1.7.

Le gros bonus de cet parsingur est l’implémentation de XPath 1.0! Pour toutes les requêtes d’arbres plus complexes, XPath est une fonctionnalité envoyée par Dieu!

Une interface de type DOM avec de riches possibilités de parcours / modification est extrêmement utile pour s’attaquer à des fichiers XML “lourds” dans la vie réelle.

C’est petit, parsingur rapide. C’est un bon choix, même pour iOS ou Android, si vous ne craignez pas de lier du code C ++.

Les points de repère peuvent en dire long. Voir: http://pugixml.org/benchmark.html

Quelques exemples pour (x86):

pugixml is more than 38 times faster than TinyXML 4.1 times faster than CMarkup, 2.7 times faster than expat or libxml 

Pour (x64), pugixml est l’parsingur le plus rapide que je connaisse.

Vérifiez également l’utilisation de la mémoire par votre parsingur XML. Certains parsingurs gobent une mémoire précieuse!