71 votes

Utilisation de Boost pour lire et écrire des fichiers XML

Existe-t-il un bon moyen (et un moyen simple aussi) d'utiliser Boost pour lire et écrire des fichiers XML ?

Je ne trouve pas d'exemple simple pour lire des fichiers XML avec Boost. Pouvez-vous m'indiquer un exemple simple qui utilise Boost pour lire et écrire des fichiers XML ?

Si ce n'est pas Boost, y a-t-il une bonne et simple bibliothèque pour lire et écrire des fichiers XML que vous pouvez recommander ? (il doit s'agir d'une bibliothèque C++)

4 votes

Essayez Boost.PropertyTree . Vous pouvez trouver une brève introduction à la lecture/écriture de fichiers XML avec lui ici .

64voto

Cristian Adam Points 3691

Vous devriez essayer pugixml Analyseur XML léger, simple et rapide pour C++.

La plus belle chose à propos de pugixml est la fonction XPath ce qui manque à TinyXML et RapidXML.

Citant l'auteur de RapidXML "Je voudrais remercier Arseny Kapoulkine pour son travail sur pugixml, qui a été une inspiration pour ce projet" et "5% - 30% plus rapide que pugixml, le parseur XML le plus rapide que je connaisse" Il avait testé contre la version 0.3 de pugixml, qui a atteint récemment la version 0.42.

Voici un extrait de la documentation de pugixml :

Les principales caractéristiques sont les suivantes :

  • faible consommation de mémoire et fragmentation (le gain par rapport à pugxml est de ~1,3 fois, TinyXML - ~2,5 fois, Xerces (DOM) - ~4,3 fois 1). Les chiffres exacts peuvent être vus dans la section Comparaison avec les analyseurs existants.
  • vitesse d'analyse syntaxique extrêmement élevée (le gain par rapport à pugxml est de ~6 fois, TinyXML - ~10 fois, Xerces-DOM - ~17.6 fois 1
  • une vitesse d'analyse syntaxique extrêmement élevée (bon, je me répète, mais il est si rapide qu'il surpasse Expat de 2,8 fois sur le XML de test) 2
  • plus ou moins conforme à la norme (il analysera correctement tout fichier conforme à la norme, à l'exception des problèmes liés aux DTD)
  • pratiquement insensible aux erreurs (il ne s'étouffera pas sur quelque chose comme You & Me, comme le fera expat ; il analysera les fichiers dont les données sont mal codées, etc.)
  • interface propre (celle de pugxml fortement remaniée)
  • plus ou moins conscient de l'Unicode (en fait, il suppose un encodage UTF-8 des données d'entrée, bien qu'il fonctionnera facilement avec ANSI - pas d'UTF-16 pour l'instant (voir Travaux futurs), avec des fonctions de conversion d'aide (UTF-8 <-> UTF-16/32 (quel que soit le défaut pour std::wstring & wchar_t))
  • code C++ entièrement conforme aux normes (approuvé par Comeau en mode strict) ; la bibliothèque est multiplateforme (voir la référence pour la liste des plateformes)
  • une grande flexibilité. Vous pouvez contrôler de nombreux aspects de l'analyse des fichiers et de la construction de l'arbre DOM par le biais d'options d'analyse.

Bon, vous vous demandez peut-être : quel est le piège ? Tout est si joli - c'est une solution petite, rapide, robuste et propre pour analyser le XML. Que manque-t-il ? Ok, nous sommes des développeurs honnêtes - alors voici une liste de défauts :

  • la consommation de mémoire. Il bat tous les analyseurs DOM que je connais, mais quand l'analyseur SAX arrivera, il n'y aura aucune chance. Vous ne pouvez pas traiter un fichier XML de 2 Go avec moins de 4 Go de mémoire - et le faire rapidement. Bien que pugixml se comporte mieux que tous les autres parseurs basés sur DOM, donc si vous êtes coincé avec DOM, ce n'est pas un problème.
  • la consommation de mémoire. Ok, je me répète. Encore une fois. Quand d'autres parsers vous permettent de fournir un fichier XML dans un stockage constant (ou même comme une zone de mémoire mappée), pugixml ne le fait pas. Vous devrez donc copier l'ensemble des données dans une zone de stockage non-constante. De plus, elles doivent persister pendant la durée de vie de l'analyseur (les raisons pour cela et plus sur les durées de vie sont écrites ci-dessous). Encore une fois, si vous êtes d'accord avec DOM - cela ne devrait pas être un problème, car la consommation globale de mémoire est moindre (bien que vous aurez besoin d'un morceau de mémoire contigu, ce qui peut être un problème).
  • absence de validation, traitement des DTD, espaces de noms XML, traitement correct de l'encodage. Si vous en avez besoin, prenez MSXML, XercesC ou autre.

0 votes

Pugixml a maintenant une analyse syntaxique UTF-8, UTF-16, UTF-32.

0 votes

@CristianAdam Je n'arrive pas à savoir s'il supporte le parsing SAX ou non... Je suppose que oui puisque vous dites qu'il ne peut pas traiter un fichier XML de 2GiB avec moins de 4GiB de mémoire.

0 votes

TinyXpath ajoute le support xpath à TinyXML.

25voto

stephan Points 6006

TinyXML est probablement un bon choix. Quant à Boost :

Il y a le Arbre des biens dans la bibliothèque de la Dépôt de Boost . Il a été accepté, mais le soutien semble manquer pour le moment (EDIT : Arbre des biens fait désormais partie de Boost depuis la version 1.41 , lire la documentation concernant sa fonctionnalité XML).

Daniel Nuffer a mis en place un analyseur xml pour Boost Spirit.

1 votes

Aussi, utilisez TinyXpath avec TinyXML

16voto

Anteru Points 8581

Il y a aussi TinyXML qui est une petite et agréable bibliothèque C++. Si vous recherchez une bibliothèque de plus bas niveau, RapidXML est un excellent point de départ.

1 votes

Aussi, utilisez TinyXpath avec TinyXML

4voto

Skurmedel Points 9227

Il n'y a pas de bibliothèque spécifique dans boost pour l'analyse XML, mais il y a beaucoup d'alternatives, en voici quelques-unes : libxml , Xerces , Expat

Bien sûr, vous pouvez utiliser certaines des autres bibliothèques de Boost pour vous aider à créer votre propre bibliothèque, mais ce sera probablement une entreprise assez lourde.

Et voici un article entier sur le sujet par IBM.

4voto

StackedCrooked Points 12247

Boost ne fournit pas d'analyseur XML pour le moment.

Poco XML (qui fait partie de l Poco C++ libs ) est bon et simple.

0 votes

Je ne peux pas me prononcer sur la qualité des bibliothèques C++ de Poco, mais d'un point de vue stylistique, elles sont très différentes de Boost. Pour quelqu'un qui souhaite interagir avec les autres composants de Boost et la STL, ce n'est peut-être pas une bonne solution. Je ne fais pas référence aux conventions de nommage (bien qu'elles puissent être irritantes), mais plutôt à l'utilisation intensive de l'héritage, des fonctions virtuelles et à l'absence de modèle sur un type de caractère. Ces décisions de conception peuvent être ou ne pas être pour le mieux, mais elles sont certainement très différentes de celles de Boost et de la STL.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X