Quel parsingur XML dois-je utiliser en C ++?

J’ai des documents XML que je dois parsingr et / ou j’ai besoin de créer des documents XML et de les écrire en texte (fichiers ou mémoire). Étant donné que la bibliothèque standard C ++ ne possède pas de bibliothèque pour cela, que dois-je utiliser?

Note: Ceci est destiné à être une question de style C ++ – FAQ définitive. Donc oui, c’est un duplicata des autres. Je ne me suis pas contenté de répondre à ces autres questions car elles avaient tendance à demander quelque chose de plus spécifique. Cette question est plus générique.

Il existe une autre approche de la gestion du code XML que vous pouvez envisager, appelée liaison de données XML. Surtout si vous avez déjà une spécification formelle de votre vocabulaire XML, par exemple, dans XML Schema.

La liaison de données XML vous permet d’utiliser XML sans effectuer d’parsing syntaxique ou de sérialisation XML. Un compilateur de liaison de données génère automatiquement tout le code de bas niveau et présente les données analysées en tant que classes C ++ correspondant à votre domaine d’application. Vous travaillez ensuite avec ces données en appelant des fonctions et en utilisant des types C ++ (int, double, etc.) au lieu de comparer des chaînes et d’parsingr du texte (ce que vous faites avec des API d’access XML de bas niveau telles que DOM ou SAX).

Voir, par exemple, une implémentation de liaison de données XML open-source que j’ai écrite, CodeSynthesis XSD et, pour une version plus légère et sans dépendance, CodeSynthesis XSD / e .

Mets aussi le mien.

http://www.codeproject.com/Articles/998388/XMLplusplus-version-The-Cplusplus-update-of-my-XML

Aucune fonctionnalité de validation XML, mais rapide.

Dans Secured Globe , Inc., nous utilisons rapidxml . Nous avons essayé tous les autres mais rapidxml semble être le meilleur choix pour nous.

Voici un exemple:

  rapidxml::xml_document doc; doc.parse<0>(xmlData); rapidxml::xml_node* root = doc.first_node(); rapidxml::xml_node* node_account = 0; if (GetNodeByElementName(root, "Account", &node_account) == true) { rapidxml::xml_node* node_default = 0; if (GetNodeByElementName(node_account, "default", &node_default) == true) { swprintf(result, 100, L"%hs", node_default->value()); free(xmlData); return true; } } free(xmlData); 

Une autre remarque à propos d’Expat: il vaut la peine de regarder le travail sur les systèmes embarqués. Cependant, la documentation que vous êtes susceptible de trouver sur le Web est ancienne et erronée. Le code source contient des commentaires assez détaillés au niveau de la fonction, mais il faudra du temps pour les comprendre.

Alors ok. J’en ai créé un nouveau, car aucune de ces listes n’était conforme à mes besoins.

Avantages:

  1. Pull-parer API de streaming au niveau bas ( Java StAX like )
  2. Exceptions et modes RTTI de supportés
  3. Limite d’utilisation de la mémoire, prise en charge de fichiers volumineux (testé avec un fichier XMark de 100 Mo , la vitesse dépend du matériel)
  4. Support UNICODE et détection automatique pour le codage de la source d’entrée
  5. API de haut niveau pour la lecture dans les structures / POCO
  6. API de méta-programmation pour l’écriture et la génération de XSD à partir de structures / POCO avec prise en charge de la structure xml (atsortingbuts et tags d’imbrication) (la génération XSD nécessite RTTI, mais ne peut être utilisée que pour le déboguer)
  7. C ++ 11 – GCC et VC ++ 15+

Désavantages:

  1. Validation DTD et XSD non encore fournie
  2. Obtention de XML / XSD par HTTP / HTTPS en cours, pas encore terminé
  3. Nouvelle bibliothèque

Projet de maison