Quelle est la différence entre SAX et DOM?
J'ai lu quelques articles sur le XML analyseurs et est venu à travers SAX et DOM.
SAX est basé sur des événements et DOM est modèle d'arbre -- je ne comprends pas les différences entre ces concepts.
De ce que j'ai compris, basé sur un événement implique un certain type d'événement se produit pour le nœud. Comme lorsque l'on clique sur un nœud particulier, il donnera à tous les sous-nœuds plutôt que de se charger de tous les nœuds dans le même temps. Mais dans le cas de DOM l'analyse il va charger tous les noeuds et de faire le modèle d'arbre.
Est ma compréhension correcte?
S'il vous plaît corrigez-moi Si je me trompe ou m'expliquer basé sur des événements et de modèle d'arbre dans une manière plus simple.
- À proprement parler, DOM n'est pas un analyseur. Tout les DOM-base logiciel pourrait ou ne pourrait pas intégrer le balisage de l'analyse, et la plupart des DOM HTML logiciel ne. Mais DOM est un tout distinct chose qui pourrait ne pas être associé avec n'importe quel format de sérialisation à tous.
Vous devez vous connecter pour publier un commentaire.
Bien, vous êtes à proximité.
SAX, des événements sont déclenchés lorsque le fichier XML est analysé. Lorsque l'analyseur est de parser le XML, et rencontre une balise de départ (par exemple,
<something>
), puis il déclenche latagStarted
événement (nom réel de l'événement peut être différente). De même, lorsque la fin de la balise est rencontré lors de l'analyse (</something>
), il déclenchetagEnded
. À l'aide d'un analyseur SAX implique que vous avez besoin pour gérer ces événements et de donner un sens aux données retournées à chaque événement.Dans les DOM, il n'y a pas d'événements déclenchés lors de l'analyse. L'ensemble de XML est analysé et une arborescence DOM (des nœuds dans le XML) est généré et s'en retourna. Une fois analysée, l'utilisateur peut naviguer dans l'arborescence pour accéder aux données déjà intégrées dans les divers nœuds dans le XML.
En général, dans les DOM est plus facile à utiliser mais a une surcharge de l'analyse de l'ensemble de XML avant de pouvoir commencer à l'utiliser.
En quelques mots...
SAX (Smise UNPI pour XML): Est un flux à base de processeur. Vous n'avez qu'une infime partie de la mémoire à tout moment et vous "renifler" le flux de données XML par la mise en œuvre de rappel code pour des événements comme
tagStarted()
etc. Il n'utilise presque pas de mémoire, mais vous ne pouvez pas faire "DOM" choses", comme l'utilisation de xpath ou parcourir les arbres.DOM (Document Oobjet Model): Vous chargez le tout dans la mémoire - c'est un grand dévoreur de mémoire. Vous pouvez souffler la mémoire avec la même taille moyenne des documents. Mais vous pouvez utiliser xpath et parcourir l'arbre etc.
Ici en termes plus simples:
DOM
Modèle d'arbre de parser (à base d'Objets) (Arbre de nœuds).
DOM charge le fichier dans la mémoire et ensuite d'analyser le fichier.
A des contraintes de mémoire, car il charge le fichier XML avant l'analyse.
DOM est de lire et d'écrire (pouvez insérer ou supprimer des nœuds).
Si le contenu du fichier XML est petit, préfèrent les DOM parser.
Amont et en aval de la recherche est possible pour la recherche de balises et d'évaluation de la
informations à l'intérieur des balises. Donc, ce qui donne la facilité de navigation.
Plus lent à l'exécution.
SAX
Cas d'analyseur (Séquence d'événements).
SAX traite le fichier tel qu'il se lit, par exemple, analyse de nœud en nœud.
Pas de contraintes de mémoire car il ne stocke pas le contenu du fichier XML dans la mémoire.
SAX est en lecture seule c'est à dire ne pouvez pas insérer ou supprimer le nœud.
Utiliser l'analyseur SAX lorsque le contenu de la mémoire est grande.
SAX lit le fichier XML à partir du haut vers le bas et vers l'arrière de navigation n'est pas possible.
Plus rapide au moment de l'exécution.
Vous sont correctes dans votre compréhension de la DOM base de modèle. Le fichier XML sera chargé comme un tout et tout son contenu sera construite comme une représentation en mémoire de l'arbre du document représente. Cela peut prendre du temps et de la mémoire du temps, en fonction de la taille du fichier d'entrée est. L'avantage de cette approche est que vous pouvez facilement requête de toute partie du document, et de manipuler librement tous les nœuds de l'arbre.
Les DOM approche est généralement utilisée pour de petites structures XML (où les petites dépend de la puissance et de la mémoire de votre plate-forme a), qui peuvent avoir besoin d'être modifié et interrogés de différentes façons, une fois qu'ils ont été chargés.
SAX sur l'autre main est conçu pour traiter le XML d'entrée de pratiquement n'importe quelle taille. Au lieu de le framework XML de faire le travail dur pour vous dans la compréhension de la structure du document et la préparation potentiellement un grand nombre d'objets pour tous les nœuds, les attributs, etc., SAX complètement les feuilles que vous.
Ce qu'il fait est de lire les commentaires de la haut et invoquer des méthodes de rappel que vous fournissez lors de certains "événements" de se produire. Un événement pourrait être frappé dans une balise d'ouverture, un attribut dans la balise, recherche de texte à l'intérieur d'un élément ou à venir à travers une balise de fin.
SAX obstinément lit l'entrée et vous dit ce qu'il voit dans ce mode. C'est à vous de conserver tous les renseignements dont vous avez besoin. Cela signifie généralement que vous construisez une sorte de machine d'état.
Bien que cette approche de traitement XML est beaucoup plus fastidieux, il peut être très puissant, trop. Imaginez que vous voulez il suffit d'extraire les titres des articles de presse à partir d'un blog d'alimentation. Si vous lisez ce document XML à l'aide de DOM il serait de charger tout le contenu de l'article, toutes les images etc. qui sont contenues dans le fichier XML en mémoire, même si vous n'êtes pas intéressé par elle.
Avec SAX, vous pouvez simplement vérifier si le nom de l'élément est e. g.) "titre" à chaque fois que votre "startTag de l'événement" la méthode est appelée. Si oui, vous savez que vous avez besoin d'ajouter que la prochaine "elementText" événement offre à vous. Lorsque vous recevez le "endTag" cas d'appel, vous vérifiez de nouveau si ce n'est l'élément de fermeture de la "titre". Après cela, il suffit d'ignorer tous les autres éléments, jusqu'à ce que l'entrée se termine, ou d'une autre "startTag" avec un nom de "titre" vient le long. Et ainsi de suite...
Vous avez pu lire au travers de mégaoctets et mégaoctets de XML de cette manière, l'extraction de la petite quantité de données dont vous avez besoin.
Le côté négatif de cette approche est, bien sûr, que vous avez besoin de faire beaucoup plus de livre-rester soi-même, selon ce que les données dont vous avez besoin pour l'extraction et le degré de complexité de la structure XML. En outre, vous ne peut naturellement pas modifier la structure de l'arborescence XML, car vous ne l'avez dans la main comme un tout.
Donc, en général, SAX est adapté pour le peignage à travers potentiellement de grandes quantités de données que vous recevez avec une "requête" à l'esprit, mais n'a pas besoin de modifier, tandis que DOM est plus destiné à vous donner une totale flexibilité dans l'évolution de la structure et du contenu, au détriment de la hausse de la demande de ressources.
Que vous comparez des pommes et des poires. SAX est analyseur qui analyse sérialisé DOM structures. Il ya beaucoup de différents analyseurs, et "événementiel" se réfère à l'analyse de la méthode.
Peut-être un petit récapitulatif est dans l'ordre:
La modèle d'objet de document (DOM) est un résumé du modèle de données qui décrit une structure hiérarchique, basés sur l'arborescence de la structure du document; un arbre de document se compose de nœuds, à savoir d'éléments, d'attributs et les nœuds de texte (et quelques autres). Les nœuds ont les parents, les frères et sœurs et les enfants et peut être parcouru, etc., tous les trucs que vous avez l'habitude de le faire en JavaScript (qui, incidemment, n'a rien à voir avec les DOM).
Un DOM structure peut être sérialisé, c'est à dire écrit dans un fichier, à l'aide d'un langage de balisage comme HTML ou XML. Un fichier HTML ou XML contient donc un "écrit" ou "aplati" version d'un document abstrait arbre.
Pour un ordinateur à manipuler, ou même afficher une arborescence DOM à partir d'un fichier, il doit désérialiser, ou analyser, le fichier et de le reconstruire à l'abstrait, arbre en mémoire. C'est là que l'analyse est en.
Nous arrivons maintenant à la nature des analyseurs. Une façon d'analyser serait à lire dans l'ensemble du document et de manière récursive construire une arborescence dans la mémoire, et enfin d'exposer l'ensemble du résultat à l'utilisateur. (Je suppose que vous pourriez appeler ces analyseurs "DOM analyseurs".) Ce serait très pratique pour l'utilisateur (je pense que c'est ce que PHP XML parser), mais il souffre de problèmes d'évolutivité et devient très cher pour des documents volumineux.
D'autre part, basée sur des événements l'analyse, comme le fait par SAX, regarde le fichier de façon linéaire et rend tout simplement rappels à l'utilisateur chaque fois qu'il rencontre une pièce de structure de données, comme des "cet élément a commencé", que "l'élément fini", "texte ici", etc. Ceci a l'avantage qu'il peut aller à l'infini sans se préoccuper de la taille du fichier d'entrée, mais il est beaucoup plus faible niveau, car il oblige l'utilisateur à faire tous les travaux de traitement (en fournissant des rappels). Pour revenir à votre question initiale, le terme "événement à base de" se réfère à ceux l'analyse des événements que l'analyseur soulève qu'il parcourt le fichier XML.
La Article de Wikipedia a beaucoup de détails sur les étapes de SAX de l'analyse.
Je vais donner des Q&A-orienté de réponse à cette question:
Répondre à des Questions
Nous avons besoin de parser XML parce que nous ne voulons pas faire tout en notre application à partir de zéro, et nous avons besoin d'une "aide" de programmes ou de bibliothèques pour faire quelque chose de très bas niveau, mais très nécessaire pour nous. Ces bas-niveau, mais les choses nécessaires inclure de vérifier le bien-formation, de la validation du document par rapport à sa DTD ou un schéma (juste pour la validation des parsers), la résolution de référence de caractère, la compréhension des sections CDATA, et ainsi de suite. Parseurs XML sont à "l'aide" des programmes et qu'ils vont faire tous ces travaux. Avec analyseur XML, nous sommes à l'abri de beaucoup de ces difficultés et de nous concentrer sur nous-mêmes juste de programmation de haut niveau par le biais de l'API est mis en œuvre par les analyseurs syntaxiques, et ainsi gagner de la programmation de l'efficacité.
Les deux SAX et DOM parser ont leurs avantages et leurs inconvénients. Quel est le meilleur doit dépendre des caractéristiques de votre application (veuillez vous référer aux quelques questions ci-dessous).
Analyseur SAX pouvez obtenir la meilleure vitesse.
Un arbre basé sur l'API est centrée autour d'une structure de l'arbre et, par conséquent, fournit des interfaces des composants de l'arbre (qui est un document DOM) comme Document d'interface,interface de Nœud, NodeList interface, interface de l'Élément, l'Attribut de l'interface et ainsi de suite. Par contraste, toutefois, un événement basé sur l'API fournit des interfaces pour les maîtres-chiens. Il y a quatre gestionnaire d'interfaces, l'interface ContentHandler, DTDHandler interface, EntityResolver interface et ErrorHandler interface.
Parseurs DOM et SAX analyseurs de travail de différentes façons:
Un DOM parser crée une arborescence dans la mémoire à partir de l'entrée
le document, puis attend les demandes du client. Mais un parser SAX
ne crée pas de structure interne. Au lieu de cela, il prend l'
les occurrences de composants d'un document d'entrée comme des événements, et dit
le client de ce qu'il lit comme on lit à travers le document d'entrée. Un
DOM parser est toujours au service de l'application client avec l'ensemble de la
document peu importe combien est réellement nécessaire par le client. Mais un
Analyseur SAX sert le client demande toujours seulement avec des pièces de
le document à un moment donné.
application client doivent être explicites et forme une sorte de chaîne. Mais
avec le SAX, certaines méthodes de certains (généralement écrasé par le client) sera
être invoquée automatiquement (implicitement) d'une manière qui est appelé
"callback" lorsque certains événements se produisent. Ces méthodes n'ont pas
pour être appelé explicitement par le client, mais nous pourrions les appeler
explicitement.
Idéalement un bon analyseur doit être rapide (efficace),de l'espace efficace, riche en fonctionnalités et facile à utiliser. Mais en réalité, aucun des principaux analyseurs ont toutes ces caractéristiques en même temps. Par exemple, un DOM Parser est riche en fonctionnalité (parce qu'il crée une arborescence DOM en mémoire et vous permet d'accéder à une partie du document à plusieurs reprises et vous permet de modifier l'arborescence DOM), mais il est inefficace de l'espace lorsque le document est énorme, et il faut un peu de temps à apprendre comment travailler avec elle. Un Analyseur SAX, cependant, est beaucoup plus efficace de l'espace en cas de gros document d'entrée (car il ne crée pas de structure interne). Qui plus est, il fonctionne plus rapidement et est plus facile à apprendre que DOM Parser parce que son API est très simple. Mais à partir de la fonctionnalité de point de vue, il offre moins de fonctions, ce qui signifie que les utilisateurs eux-mêmes ont à prendre soin de plus, comme la création de leurs propres structures de données. Par la manière, ce qui est un bon analyseur? Je pense que la réponse dépend vraiment des caractéristiques de votre application.
Dans les cas suivants, à l'aide de parser SAX est plus avantageux qu'à l'aide de DOM parser.
Dans les cas suivants, à l'aide de DOM parser est plus avantageux qu'à l'aide de parser SAX.
Exemple (Utilisation d'un analyseur de modèle DOM ou SAX parser?):
Supposons que le professeur dispose d'un document XML contenant toutes les informations personnelles des étudiants aussi bien que les points de son les étudiants de sa classe, et il est maintenant en attribuant des notes finales des élèves à l'aide d'une application. Ce qu'il veut, pour produire, une liste avec le SSN et les grades. Aussi, nous supposons que, dans sa demande, l'instructeur de l'utilisation pas de structure de données tels que des tableaux pour stocker l'élève des renseignements personnels et les points.
Si l'enseignant décide de donner Un de ceux qui a gagné la classe moyenne ou au-dessus, et de donner un B pour les autres, alors il vaut mieux utiliser un DOM parser dans son application. La raison en est qu'il n'a aucun moyen de savoir de combien est la classe moyenne avant que l'ensemble du document est traitée. Ce qu'il a probablement besoin de le faire dans son application, est d'abord de regarder à travers tous les étudiants de points et de calculer la moyenne, et puis regardez à travers le document de nouveau et d'attribuer la note finale de chaque étudiant en comparant les points qu'il a gagné à la classe moyenne.
Si, toutefois, l'enseignant adopte une telle politique d'évaluation que les étudiants qui ont obtenu 90 points ou plus, sont affectés à Un et les autres sont affectés B, alors probablement qu'il vaut mieux utiliser un parser SAX. La raison en est, pour assigner à chaque élève une note finale, il n'a pas besoin d'attendre pour l'ensemble du document à traiter. Il pourrait immédiatement attribuer un grade à un étudiant une fois que l'analyseur SAX lit la note de l'élève.
Dans l'analyse ci-dessus, nous avons supposé que l'instructeur n'a créé aucune structure de données de son propre. Si il crée sa propre structure de données, tel qu'un tableau de chaînes de caractères pour stocker le SSN et un tableau d'entiers à sto re les points ? Dans ce cas, je pense que SAX est un meilleur choix, avant ce qui pourrait sauver à la fois la mémoire et du temps en tant que bien, mais faire le travail.
Eh bien, on a plus de considération sur cet exemple. Si ce que l'instructeur veut faire, c'est de ne pas imprimer une liste, mais pour enregistrer le document d'origine est de retour avec le grade de chaque élève à jour ? Dans ce cas, un DOM parser doit être un meilleur choix, peu importe ce que la politique d'évaluation, il est en train d'adopter. Il n'a pas besoin de créer une structure de données de son propre. Ce qu'il faut faire, c'est d'abord de modifier l'arborescence du DOM (c'est à dire, réglez la valeur de la "qualité" nœud) puis sauvegarder l'ensemble de l'arbre modifié. S'il choisit d'utiliser un parser SAX au lieu d'un DOM parser, alors dans ce cas il doit créer une structure de données qui est presque aussi compliqué que de faire une arborescence DOM avant qu'il puisse faire le travail.
Un Exemple
Programme avec DOMparser
Programme avec SAXparser
Dans la pratique: book.xml
start element:abc
,end element:abc
.Ce document XML, lorsqu'elle est transmise par l'intermédiaire d'un analyseur SAX, va générer une séquence d'événements comme les suivantes:
attr: "lang"
ci-dessuselement: <title>
dans la représentation visuelle de DOM analyse? En regardant le fichier XML, il ressemble à unattr
doit être parallèle à ses<element>
comme avec<book>
etcategory
. Est-ce juste une économie de l'espace technique ou est-il une relation parent-enfant est-il destiné?DOM est synonyme de Modèle d'Objet de Document et ce qu'il représente d'un Document XML en forme d'arbre dont chaque élément représente les branches des arbres. DOM Parser crée une Mémoire de représentation en arborescence du fichier XML, puis de l'analyse, de sorte qu'il exige plus de mémoire et sa conseillé d'avoir une augmentation de la taille du tas de DOM parser afin d'éviter de Java.lang.OutOfMemoryError:java heap space . L'analyse du fichier XML à l'aide de DOM parser est assez rapide si le fichier XML est petite, mais si vous essayez de lire un gros fichier XML à l'aide de DOM parser il n'y a plus de chances que cela va prendre beaucoup de temps ou peut même ne pas être en mesure de charger complètement tout simplement parce qu'il nécessite beaucoup de mémoire pour créer XML Arborescence Dom. Java fournit un soutien DOM Analyse et vous pouvez convertir des fichiers XML en Java à l'aide de DOM parser. DOM les classes sont en w3c.dom package DOM Parser for Java est en JAXP (Java API for XML Parsing) package.
SAX Parser XML en Java
SAX est pour Simple API for XML Parsing. C'est un événement à partir de l'Analyse XML et analyser fichier XML, étape par étape, de manière beaucoup plus adapté pour les gros Fichiers XML. SAX Parser XML feux de l'événement quand il a rencontré la balise d'ouverture de l'élément ou de l'attribut et de l'analyse des œuvres en conséquence. Il est recommandé d'utiliser SAX parser XML pour l'analyse des fichiers xml en Java, car il n'a pas besoin de charger un fichier XML en Java et il peut lire un gros fichier XML dans de petites pièces. Java fournit un support pour parser SAX et vous pouvez convertir tout fichier xml en Java à l'aide d'Analyseur SAX, j'ai couvert exemple de lecture de fichier xml Parser SAX ici. Un inconvénient de l'utilisation d'Analyseur SAX en java est que la lecture d'un fichier XML en Java à l'aide d'Analyseur SAX nécessite plus de code en comparaison de DOM Parser.
Différence entre les DOM et SAX Parser XML
Voici quelques différences de niveau entre les DOM et l'analyseur de Parser SAX en Java:
1) DOM analyseur de charge de tout document xml en mémoire lors d'un SAX charge uniquement une petite partie du fichier XML en mémoire.
2) DOM parser est plus rapide que SAX, car il accès à tout document XML en mémoire.
3) analyseur SAX en Java est mieux adapté pour les gros fichier XML que DOM Parser, car il n'a pas besoin de beaucoup de mémoire.
4) DOM analyseur fonctionne sur le Modèle d'Objet de Document tout en SAX est un événement basé sur xml parser.
Lire la suite: http://javarevisited.blogspot.com/2011/12/difference-between-dom-and-sax-parsers.html#ixzz2uz1bJQqZ
Les deux SAX et DOM sont utilisées pour analyser le document XML. Les deux ont des avantages et des inconvénients et peut être utilisé dans notre programmation en fonction de la situation
SAX:
Analyse de nœud en nœud
Ne stocke pas le XML en mémoire
Nous ne pouvons pas insérer ou supprimer un nœud
Haut vers le bas de la traversée de
DOM
Stocke l'intégralité du document XML en mémoire avant de le traiter
Occupe plus de mémoire
On peut insérer ou supprimer des nœuds
Traverse, dans n'importe quelle direction.
Si nous avons besoin de trouver un nœud et n'a pas besoin d'insérer ou de supprimer des on peut aller avec SAX lui-même autrement DOM pourvu que nous ayons plus de mémoire.
1) DOM analyseur de charge de tout document XML en mémoire lors d'un SAX charge uniquement une petite partie du fichier XML en mémoire.
2) DOM parser est plus rapide que SAX, car il accès à tout document XML en mémoire.
3) analyseur SAX en Java est mieux adapté pour les gros fichier XML que DOM Parser, car il n'a pas besoin de beaucoup de mémoire.
4) DOM analyseur fonctionne sur le Modèle d'Objet de Document tout en SAX est un événement basé sur XML parser.
Lire la suite: http://javarevisited.blogspot.com/2011/12/difference-between-dom-and-sax-parsers.html#ixzz498y3vPFR