Eh bien, beaucoup de questions ont été faites sur l'analyse XML en C ++ et ainsi de suite ... Mais, au lieu d'un problème générique, le mien est très spécifique. P>
Je demande un analyseur XML très efficace pour C ++. En particulier, j'ai un très très gros fichier XML à analyser. Mon application doit ouvrir ce fichier et récupérer des données. Il doit également insérer de nouveaux nœuds et enregistrer le résultat final dans le fichier. P>
Pour ce faire, je l'ai utilisé, au début, RapidXML, mais cela me demande d'ouvrir le fichier, d'analyser tout (tout le contenu car cette lib n'a aucune fonction pour accéder directement au fichier sans chargement de l'arborescence en premier), Puis modifiez l'arborescence, modifiez-le et stockez l'arborescence finale du fichier en l'écrasant ... il consomme trop de ressources. P>
existe-t-il un analyseur XML qui ne nécessite pas de charger le fichier entier, mais que je peux utiliser pour insérer, rapidement, de nouveaux nœuds et récupérer des données? Pouvez-vous s'il vous plaît indiquer des solutions pour ce problème? P>
8 Réponses :
Je suis convaincu qu'aucune bibliothèque XML n'existe qui vous permet de modifier em> un fichier sans le charger en premier. Ce n'est tout simplement pas possible car les fichiers ne fonctionnent pas de cette façon: vous ne pouvez pas insérer (ou supprimer) au milieu d'un fichier. Vous ne pouvez que écraser em> un bloc de taille identique ou appendez em> à la fin. Mais votre demande nécessiterait d'appuyer ou de supprimer au milieu du fichier. P>
lire uniquement des parties d'un fichier XML peuvent être possibles. Mais écrire em> ... aucun moyen. P>
Eh bien Non ... Il est possible que la commande ne soit pas nécessaire, il est effectué ultérieurement, par dossier de jeton, vous pouvez localiser un nœud et où l'intérieur est-il insérer le nouveau nœud ... Pas besoin d'obtenir tout le fichier ... non?
@Andry: faux. Commander est i> nécessaire dans un fichier XML. Il est possible que vous n'ayez pas besoin de cela, mais la norme XML charge que la commande des nœuds est corrigée. En outre, vous pouvez trouver une tokenision (en particulier la correspondance end i> jeton) implique à peu près la lecture du fichier entier.
Merci oui, tu as raison ... alors les choses deviennent beaucoup plus difficiles ... Je me demande comment les bibliothèques en C # ou les langues de haut niveau peuvent analyser de très gros fichiers XML en quelques millisecondes ....
@Andry: question intéressante. Peut-être qu'ils ne peuvent pas ... c'est-à-dire qu'ils "prétendent" d'analyser tout le dossier, mais d'attendre de la réalité jusqu'à ce que vous accédez à un nœud donné, et seulement alors i> analyser pleinement le nœud. Mais encore une fois, dès que vous essayez de modifier (et d'écrire sur le disque) n'importe quel nœud, tout le fichier doit être analysé.
Rechercher "SAX Parser". Ce sont principalement des jetons, c'est-à-dire qu'ils émettent une étiquette par balise sans construire un arbre. p>
@Andry, ils disent que Xerces a / supporte saxo, donc cela fonctionnera probablement pour vous.
Vous voulez un analyseur XML en streaming plutôt que ce qu'on appelle un analyseur DOM. P>
Il existe deux types d'analyseurs en streaming: tirer et pousser. Un analyseur de traction est bon pour écrire rapidement des analyseurs XML qui chargent des données dans la mémoire de programme. Un analyseur de poussée est bon pour écrire un programme pour traduire un document à un autre (ce que vous essayez d'accomplir). Je pense donc que un analyseur de poussée serait le mieux pour votre problème. P>
Pour utiliser un analyseur à poussée, vous devez écrire ce qui est essentiellement un gestionnaire d'événements pour les événements d'analyse. Par "Événement d'analyse", je veux dire des événements comme "Start Tag Atteint", "End Tag Atteint", "Texte trouvé", "Attribut analysé", etc. P>
Je suggère que lorsque vous lisez dans le document, vous écrivez le document transformé en un fichier temporaire distinct. Ainsi, vos gestionnaires d'événements d'analyse XML devront être écrits de manière à ce qu'ils soient énigmes et écrivent progressivement le XML du document traduit. P>
Trois excellentes bibliothèques d'analyseurs d'appoint pour C ++ incluent Expat , XERES-C ++ , et libxml2 . p>
Que vous utilisiez un analyseur de traction ou de SAX, le résultat final est le même. Les deux nécessitent des gestionnaires d'événements être utilisés alors que les données XML sont analysées dans des morceaux. La seule différence entre eux est qu'un analyseur de tir redevez automatiquement les données d'une source que vous spécifiez (comme un fichier), tandis qu'un analyseur de poussée vous permet d'obtenir les données vous-même et de le transmettre à l'analyseur (à cet égard, un analyseur de pull utilise un. appuyer sur le modèle en interne). Les deux analyseurs ont le même type de logique interne, cependant, étant donné un morceau de données, analysez les événements et les incendies au besoin, puis tirez / attendez le prochain morceau et répétez ...
... Donc, vos gestionnaires d'événements SAX peuvent extraire les données selon les besoins en temps réel, tandis que le XML est analysé dans des morceaux, puis vous pouvez écrire les données fournies dans un fichier Temp, écrire de nouvelles données si nécessaire, puis remplacez le Fichier d'origine avec le fichier Temp lorsque vous avez terminé.
En outre, j'utilise libxml2 dans mon code C ++, fonctionne bien. Il prend en charge les modèles DOM et SAX (Pull and Push).
@Remy: Bien qu'il soit vrai que les analyseurs traction et poussoirs sont très similaires, je souligne principalement deux scénarios où je pense qu'un analyseur de pull ou un analyseur à poussée doit être utilisé à cause de la commodité. D'après mon expérience, l'un ou l'autre type d'analyse peut être utilisé pour les deux scénarios, mais j'ai trouvé plus facile d'utiliser un analyseur de pull au lieu d'un analyseur de poussée dans certains cas.
@TAveryone: Eh bien merci, ils sont des suggestions de blessures ... J'ai juste une question, ici: RapidXML. sourceforge.net/manual.html Si vous faites glisser un peu, vous pouvez voir une table indiquant des performances pour RapidXML vs le monde ... Eh bien, il est dit que RapidXML est le FastSt, même 100x que XERCES ... Où est l'astuce??????? Comment est-ce possible ... Est-ce vraiment xerces si mal? Xerces peut analyser mon fichier plus rapidement que RapidXML?
@Andry: Xerces fournit une implémentation d'analyseurs DOM. Je suppose que RapidXML (un analyseur de style DOM) comparaît ses timings contre cela.
@Andry: une autre raison pour laquelle l'analyseur de RapidXML peut être plus rapide que celui de DOM de Xerces est que RapidXML ne semble pas être un véritable analyseur DOM; Du Documents API RapidXML, il n'apparaît pas que son type xml_document code> implémente n'importe quel niveau de la norme W3C DOM. DOM nécessite des frais généraux, ce qui peut être la principale raison pour laquelle RapidXML est plus rapide que les analyseurs DOM de Xerces.
Encore mieux utiliser Stax Parser, mais seulement quelques analyseurs de stax disponibles pour C ++
Les analyseurs SAX sont plus rapides que les analyseurs DOM, car les analyseurs DOM ont lu l'intégralité du fichier dans la mémoire avant de créer une représentation en mémoire du document XML, alors qu'un analyseur SAX se comporte comme un auditeur d'événements et crée le document tel qu'il se lit dans le fichier. . Allez ici pour une explication. P>
Comme vous l'avez mentionné Xerces est un bon analyseur de saxo de la SAX C ++. P>
Je recommanderais de regarder les moyens de casser le document XML dans des documents XML plus petits, car cela semble faire partie de votre problème. P>
D'accord, voici une piste battue, je l'ai regardée, mais je ne l'ai pas vraiment utilisé moi-même, ça s'appelle asmxml . Ces garçons revendiquent la barre de performance, l'inconvénient, vous avez besoin d'assembleur X86. P>
@downvoter, s'il vous plaît expliquer? Je venais de souligner un analyseur inhabituel qui revendique une meilleure performance que la plupart des grands analyseurs, ce qui ne va pas avec ce que j'ai dit?
Je pense que le bowvote était parce que l'OP a spécifié un analyseur en C ++.
@Chris, HMM, l'analyseur est écrit dans Assembleur Oui, mais il est destiné à être utilisé dans des applications C ++! Je n'aurais pas dérangé de l'afficher autrement! :(
En fait, je suis d'accord avec toi. C'était juste donner une supposition éduquée sur la raison pour laquelle le bowvote. Je le remette à 0 pour ya aussi. :-)
Une bonne raison de la baisse pourrait être que ceci est un analyseur seulement 32 bits et ne peut pas être lié à des applications 64 bits. Voir le FAQ . Cela implémente également un sous-ensemble de XML.
Si vous recherchez vraiment
aller pour les bibliothèques de modèle autant que possible, comme Boost :: Property_tree ou Boost :: XMLPARSER ou POCO :: XML et FOLLY contient un analyseur XML. P>
Évitez les vieilles bibliothèques C, toutes les conceptions de code anciennes. P>
Quelqu'un dit que le module QTXML est une performance élevée pour d'énormes fichiers XML. P>
"XML haute performance" - n'est-ce pas un oxymoron?
Depuis l'un des créateurs de ce site, pourquoi XML n'est pas une base de données: Joelonsoftware.com/articles/ FOG0000000319.HTML