Quelle bibliothèque à utiliser pour écrire em> fichier XML dans un programme C ++? P>
J'ai trouvé deux classes postées dans CodeProject P>
7 Réponses :
Vous pouvez utiliser Xerces-C ++, une bibliothèque écrite par Apache Foundation. Cette bibliothèque permet de lire, écrire et manipuler des fichiers XML. P>
Link: http://xerces.apache.org/xercesfes-c/ < / p>
J'ai essayé différentes bibliothèques et j'ai finalement décidé pour TinyXML . C'est compact, rapide, gratuit (licence Zlib) et très facile à utiliser. P>
Souhaitez-vous s'il vous plaît brièvement introduire la principale raison pour laquelle vous avez choisi TinyXML plutôt que Xerces-C?
J'ai utilisé TinyXML aussi, il est léger et dispose d'une licence qui lui permet d'être utilisée dans des applications commerciales. Très pratique si vous avez besoin d'un analyseur / générateur de fichier 1
La raison pour laquelle j'ai choisi TinyXML est parce que cela avait les caractéristiques dont j'avais besoin. Je n'ai pas rencontré un fichier XML que je ne peux pas lire. Plus important encore, la taille et que je pourrais facilement intégrer dans ma propre application sans vous soucier d'une autre DLL (par exemple, Xerces = ~ 18 Mo).
Non liée exclusivement à XML, mais existe-t-il un moyen de générer un fichier de sortie basé sur des conteneurs de grammaire? quelque chose dans STD ou Boost?
question: allez-vous mettre à jour un fichier XML? Parce que cela ressemble à ce que cela ressemble à plus d'écriture, avec XML, il nécessite toujours un analyseur. P>
tandis que XERCES est grand et gonflé, il est entièrement conformé aux normes et elle est basée sur DOM. Si vous devriez avoir à traverser la plate-forme ou changer la langue, il y aura toujours une bibliothèque basée sur Dom pour toute langue / plate-forme que vous pourriez vous déplacer afin de savoir comment les travaux d'analyse / écriture basés sur DOM sont un avantage. Si vous allez utiliser XML, vous pouvez aussi bien l'utiliser correctement. P>
Éviter l'altitude XML est bien sûr la meilleure option. Mais court de cela, j'irais avec des xerces. P>
Souhaitez-vous s'il vous plaît expliquer brièvement pourquoi vous pensez éviter XML est le meilleur si possible si possible? (Les données générées par un programme stocké au format XML seront bien définies et (sans doute) mieux que dans un fichier en plainte?)
XML est gonflé, est facile à casser et est extrêmement humain hostile. Les non-programmeurs ne peuvent pas facilement traiter avec XML sans aide programmatique. Les formats de données tels que JSON, YAML et même le format .ini sont beaucoup plus compacts et plus faciles à modifier à la main, même par des non-programmeurs.
J'ai été dans une situation similaire. J'ai eu un programme qui devait générer Json. Nous avons fait deux manières. Nous avons d'abord essayé JSONCPP , mais à la fin, je viens de générer le JSON directement via un Après, nous avons exécuté le JSON généré par un validateur pour attraper des erreurs de syntaxe. Il y en avait quelques-uns mais ils étaient vraiment faciles à trouver et à corriger. P>
Si je devais le refaire, je voudrais vraiment rouler la mienne à nouveau. Un peu de manière inattendue, il y avait moins de code lors de l'utilisation de std :: destream code>. p>
std :: destream code>. De plus, nous n'avions pas à utiliser / apprendre une nouvelle API. Il était plus facile d'écrire et est plus facile à entretenir. P>
Si je fais ce que vous suggérez, je soupçonne ce que je peux créer, dans une certaine mesure, cela va finir par réinventer la roue mises à disposition par certains code existant comme les deux liens que j'ai donnés ci-dessus ou des bibliothèques comme TinyXML et Xerces. Il s'agit d'un compromis entre le temps de développement et le temps d'apprentissage et la contrôlabilité par rapport à l'étendue du piggybacking sur le code réutilisable des autres.
Je préconiserais normalement le rouler le vôtre pour la plupart des scénarios d'entrée / sortie simples. (Croyez-moi, je déteste prendre des dépendances sur tout ce que je peux faire mieux moi-même). Mais j'ai vu trop de développeurs intelligents best-up xml de base en essayant de rouler leur propre avec des déclarations Spritntf.t Voici trop de bibliothèques XML gratuites pour C / C ++ pour considérer avant d'y aller seul. Que et chaque combinaison de langues OS a une chose indigène XML qui y va. Je ne dis pas que votre solution JSON est fausse - comme vous avez une validation de test pour cela - mais le code XML peut être buggy si vous ne faites pas attention.
Je ne préconiserai certainement pas de rouler votre propre si vous n'avez pas fait des tests de validation sur la sortie. Je voudrais aussi jamais i> Analysez XML ou JSON à la main, même si c'était simple. Lorsque vous ne faites que traiter avec la sortie (et que le format n'est pas trop complexe ou dynamique), il suffit d'imprimer la structure est généralement si facile qu'il devrait être pris en compte.
Vous ne savez jamais qui voudra lire votre XML. Générer avec une bibliothèque connue. Rouler le vôtre est juste de demander des problèmes sur la route.
@jmucchiello C'est pourquoi vous validez la sortie. Construisez un schéma et utilisez un validateur de schéma pour vous assurer que la sortie est bien formée. Honnêtement, XML n'est pas si difficile à générer i> b>.
IME, HighSpun XML n'a aucun schéma lorsque le dressage est effectué. Et plus tard, quelqu'un doit entrer et "résoudre" cela pour la valider. La maintenance Code amical utilise une bibliothèque standard lorsqu'elle est disponible. Je sais que XML n'est pas difficile de générer. J'ai également dû prendre en charge 10 formats XML différents générés par la main sans aucun code commun entre eux dans un grand projet. Comment savoir que tous les 10 étaient validés de schéma? Tellement sûr, roulez le vôtre. Mais ne vous recommande pas de rouler le vôtre sur ce type de site Web car vous ne savez jamais quand vous serez celui qui doit le corriger plus tard. :)
à mes besoins, Pugixml a fonctionné vraiment bien
La raison pour laquelle je pensais que c'était si gentil était que c'était simplement 3 fichiers, un en-tête de configuration, un en-tête et la source réelle. P>
Mais comme vous l'avez dit, vous n'êtes pas intéressé par l'analyse, alors pourquoi même la peine d'utiliser une classe spéciale pour écrire XML? Alors que vos cours sont peut-être trop complexes pour cela, j'ai trouvé que la chose facile à faire est d'utiliser le et pour le rendre encore plus facile, votre std :: ostream code> et simplement écrire une conformité standard XML de cette façon. Par exemple, disons que j'ai une classe qui représente une société code> une collection d'objets code> Employee code>, il suffit de créer une méthode dans chaque société code> et Employee Code> Classes qui ressemble à quelque chose comme le pseudocode suivant P> Employee Code> srodicxml fonction peut être déclarée virtuel code> de sorte que vous puissiez avoir une sortie spécifique pour dire un PDG code>, président code>, concierge code> ou Quels que soient les sous-classes. p> p>
Merci de suggestion. J'ai essentiellement considéré cette option. C'est à dire. Pigurbacking le code dans les deux liens dans le poteau d'origine et faire quelque chose comme vous l'avez décrit ici. Mais j'étais préoccupé par l'extensibilité à long terme du code et je me demande si vous envisagez d'utiliser plus de bibliothèque standard pour le traitement XML est utile.
Quelqu'un peut-il fournir une comparaison entre les bibliothèques TinyXML et PugixML?
J'ai utilisé l'open-source LibXML2 Bibliothèque pendant des années, fonctionne bien pour moi. P>
J'ai couru dans le même problème et enroulé Rouler ma propre solution . Il est implémenté comme un fichier d'en-tête unique que vous pouvez déposer dans votre projet: xml_writer.h p>
et il est livré avec un ensemble de Unité tests qui servent également de documentation. P>