web-dev-qa-db-fra.com

Quelle est la différence entre les extensions DOM et SimpleXML de PHP?

Je n'arrive pas à comprendre pourquoi avons-nous besoin de 2 analyseurs XML en PHP.

Quelqu'un peut-il expliquer la différence entre ces deux?

52
Stann

En un mot:

SimpleXml

  • est pour le XML simple et/ou les UseCases simples
  • aPI limitée pour travailler avec des nœuds (par exemple, ne peut pas beaucoup programmer sur une interface)
  • tous les nœuds sont du même type (le nœud d'élément est le même que le nœud d'attribut)
  • les nœuds sont magiquement accessibles, par ex. $root->foo->bar['attribute']

[~ # ~] dom [~ # ~]

  • est pour tout UseCase XML que vous pourriez avoir
  • est une implémentation de l'API W3C DOM (trouvé implémenté dans de nombreuses langues)
  • fait la différence entre différents types Node (plus de contrôle)
  • beaucoup plus verbeux grâce à l'API explicite (peut coder vers une interface)
  • peut analyser le HTML cassé
  • vous permet d'utiliser PHP fonctions dans les requêtes XPath

Les deux sont basés sur libxml et peuvent être influencés dans une certaine mesure par les fonctions libxml


Personnellement , je n'aime pas trop SimpleXml. C'est parce que je n'aime pas l'accès implicite aux nœuds, par exemple $foo->bar[1]->baz['attribute']. Il lie la structure XML réelle à l'interface de programmation. Le type à un nœud pour tout est également quelque peu intuitif, car le comportement de SimpleXmlElement change comme par magie en fonction de son contenu.

Par exemple, lorsque vous avez <foo bar="1"/> Le vidage d'objet de /foo/@bar Sera identique à celui de /foo Mais en faire un écho affichera des résultats différents. De plus, comme les deux sont des éléments SimpleXml, vous pouvez appeler les mêmes méthodes sur eux, mais ils ne seront appliqués que lorsque SimpleXmlElement le prend en charge, par exemple essayer de faire $el->addAttribute('foo', 'bar') sur le premier SimpleXmlElement ne fera rien. Maintenant, bien sûr, il est correct que vous ne pouvez pas ajouter un attribut à un nœud d'attribut, mais le fait est qu'un nœud d'attribut n'exposerait pas cette méthode en premier lieu.

Mais ce n'est que mon 2c. Décidez-vous :)


Sur un sidenote , il n'y a pas deux analyseurs, mais n couple de plus en PHP . SimpleXml et DOM sont juste les deux qui analysent un document dans une structure arborescente. Les autres sont des analyseurs/lecteurs/rédacteurs basés sur des pull ou sur des événements.

Voir aussi ma réponse à

96
Gordon

Je vais faire la réponse la plus courte possible afin que les débutants puissent la retirer facilement. Je simplifie également légèrement les choses par souci de brièveté. Aller à la fin de cette réponse pour la version TL; DR surévaluée.


DOM et SimpleXML ne sont pas en fait deux analyseurs différents . Le véritable analyseur est libxml2 , qui est utilisé en interne par DOM et SimpleXML. Ainsi, DOM/SimpleXML ne sont que deux façons d'utiliser le même analyseur et ils fournissent des moyens de convertir n objet en n autre .

SimpleXML est conçu pour être très simple, donc il a un petit ensemble de fonctions, et il se concentre sur la lecture et écrire des données . Autrement dit, vous pouvez facilement lire ou écrire un fichier XML, vous pouvez mettre à jour certaines valeurs ou supprimer certains nœuds ( avec certaines limitations! ), et c'est tout. Aucune manipulation fantaisiste , et vous n'avez pas accès aux types de nœuds moins courants. Par exemple, SimpleXML ne peut pas créer une section CDATA bien qu'il puisse les lire.

[~ # ~] dom [~ # ~] offre une implémentation complète de la DOM plus quelques méthodes non standard telles que appendXML . Si vous êtes habitué à manipuler le DOM en Javascript, vous trouverez exactement les mêmes méthodes dans le DOM de PHP. Il n'y a fondamentalement aucune limitation dans ce que vous pouvez faire et cela gère le HTML. Le revers de cette richesse de fonctionnalités est qu'elle est plus complexe et plus verbeuse que SimpleXML.


Note de côté

Les gens se demandent/demandent souvent quelle extension ils doivent utiliser pour gérer leur contenu XML ou HTML. En fait, le choix est facile car il n'y a pas beaucoup de choix pour commencer:

  • si vous avez besoin de gérer le HTML, vous n'avez pas vraiment le choix: vous devez utiliser DOM
  • si vous devez faire quelque chose d'extraordinaire comme déplacer des nœuds ou ajouter du XML brut, encore une fois vous avez à peu près avez pour utiliser DOM
  • si tout ce que vous avez à faire est de lire et/ou d'écrire du XML de base (par exemple, échanger des données avec un service XML ou lire un flux RSS), vous pouvez utiliser l'un ou l'autre. Oles deux .
  • si votre document XML est si gros qu'il ne tient pas en mémoire, vous ne pouvez pas utiliser non plus et vous devez utiliser XMLReader qui est aussi basé sur libxml2 , est encore plus ennuyeux à utiliser mais quand même joue bien avec les autres

TL; DR

  • SimpleXML est super facile à utiliser mais seulement bon pour 90% des cas d'utilisation.
  • DOM est plus complexe, mais peut tout faire.
  • XMLReader est super compliqué, mais utilise très peu de mémoire. Très situationnel.
39
Josh Davis

Comme d'autres l'ont souligné, les extensions DOM et SimpleXML ne sont pas strictement des "analyseurs XML", ce sont plutôt des interfaces différentes de la structure générée par l'analyseur libxml2 sous-jacent.

L'interface SimpleXML traite XML comme une structure de données sérialisée, de la même manière que vous traitez une chaîne JSON décodée. Il fournit donc un accès rapide au contenu d'un document, en mettant l'accent sur l'accès aux éléments par leur nom et la lecture de leurs attributs et du contenu textuel (y compris le repliement automatique entités et sections CDATA). Il prend en charge les documents contenant plusieurs espaces de noms (principalement à l'aide des méthodes children() et attributes()) et peut rechercher un document à l'aide d'une expression XPath. Il inclut également la prise en charge de la manipulation de base du contenu - par exemple l'ajout ou le remplacement d'éléments ou d'attributs avec une nouvelle chaîne.

L'interface DOM, d'autre part, traite XML comme un document structuré , où la représentation utilisée est aussi importante que les données représentées. Il fournit donc un accès beaucoup plus granulaire et explicite à différents types de "nœuds", tels que les entités et les sections CDATA, ainsi qu'à certains qui sont ignorés par SimpleXML, tels que les commentaires et les instructions de traitement. Il fournit également un ensemble beaucoup plus riche de fonctions de manipulation, vous permettant de réorganiser les nœuds et de choisir comment représenter le contenu du texte, par exemple. Le compromis est une API assez complexe, avec un grand nombre de classes et de méthodes; car il implémente une API standard (développée à l'origine pour manipuler HTML en JavaScript), il peut y avoir moins de sensation "PHP naturelle", mais certains programmeurs peuvent la connaître dans d'autres contextes.

Les deux interfaces nécessitent que le document complet soit analysé en mémoire et enveloppent efficacement les pointeurs dans cette représentation analysée; vous pouvez même basculer entre les deux wrappers avec simplexml_import_dom() et dom_import_simplexml(), par exemple pour ajouter une fonction "manquante" à SimpleXML en utilisant une fonction de l'API DOM. Pour les documents plus volumineux, le "pull-based" XMLReader ou le "event-based" XML Parser peut être plus approprié.

3
IMSoP

Comme son nom l'indique, SimpleXML est un simple analyseur de contenu XML, et rien d'autre. Vous ne pouvez pas analyser, disons le contenu html standard. C'est facile et rapide, et donc un excellent outil pour créer des applications simples.

L'extension DOM, d'autre part, est beaucoup plus puissante. Il vous permet d'analyser presque tous les documents DOM, y compris html, xhtml, xml. Il vous permet d'ouvrir, d'écrire et même de corriger le code de sortie, prend en charge xpath et globalement plus de manipulation. Par conséquent, son utilisation est beaucoup plus compliquée, car la bibliothèque est assez complexe, ce qui en fait un outil parfait pour les grands projets où une lourde manipulation des données est nécessaire.

J'espère que cela répond à votre question :)

2
usoban

Quels DOMNodes peuvent être représentés par SimpleXMLElement?

La plus grande différence entre les deux bibliothèques est que SimpleXML est principalement une seule classe: SimpleXMLElement. En revanche, l'extension DOM possède de nombreuses classes, la plupart d'entre elles un sous-type de DOMNode.

Donc, une question fondamentale lors de la comparaison de ces deux bibliothèques est laquelle des nombreuses classes proposées par DOM peut être représentée par un SimpleXMLElement à la fin?

Ce qui suit est un tableau de comparaison contenant les types DOMNode qui sont réellement utiles tant qu'il s'agit de XML (types de nœuds utiles). Votre kilométrage peut varier, par exemple lorsque vous devez gérer des DTD, par exemple:

+-------------------------+----+--------------------------+-----------+
| LIBXML Constant         |  # | DOMNode Classname        | SimpleXML |
+-------------------------+----+--------------------------+-----------+
| XML_ELEMENT_NODE        |  1 | DOMElement               |    yes    |
| XML_ATTRIBUTE_NODE      |  2 | DOMAttr                  |    yes    |
| XML_TEXT_NODE           |  3 | DOMText                  |  no [1]   |
| XML_CDATA_SECTION_NODE  |  4 | DOMCharacterData         |  no [2]   |
| XML_PI_NODE             |  7 | DOMProcessingInstruction |    no     |
| XML_COMMENT_NODE        |  8 | DOMComment               |    no     |
| XML_DOCUMENT_NODE       |  9 | DOMDocument              |    no     |
| XML_DOCUMENT_FRAG_NODE  | 11 | DOMDocumentFragment      |    no     |
+-------------------------+----+--------------------------+-----------+
  • [1]: SimpleXML résume les nœuds de texte comme valeur de chaîne d'un élément (comparez __toString ). Cela ne fonctionne bien que lorsqu'un élément contient uniquement du texte, sinon les informations textuelles peuvent être perdues.
  • [2]: Chaque analyseur XML peut étendre les nœuds CDATA lors du chargement du document. SimpleXML les étend lorsque LIBXML_NOCDATA Option est utilisé avec simplexml_load_* Fonctions ou constructeur . (L'option fonctionne également avec DOMDocument::loadXML() )

Comme le montre ce tableau, SimpleXML a des interfaces vraiment limitées par rapport au DOM. À côté de ceux de la table, SimpleXMLElement résume également l'accès aux enfants et aux listes d'attributs, ainsi que la traversée via les noms d'élément (accès aux propriétés), les attributs (accès aux tableaux) ainsi qu'être un Traversable itérant ses propres "enfants" (éléments ou attributs) et offrant un accès à l'espace de noms via les méthodes children() et attributes().

Tant que toute cette interface magique est très bien, cependant, elle ne peut pas être modifiée en s'étendant à partir de SimpleXMLElement, aussi magique qu'elle soit, aussi limitée soit-elle.

Pour savoir quel type de noeud un objet SimpleXMLElement représente, veuillez consulter:

DOM suit ici les spécifications DOMDocument Core Level 1 . Vous pouvez effectuer presque toutes les manipulations XML imaginables avec cette interface. Cependant, ce n'est que le niveau 1, donc par rapport aux niveaux DOMDocument modernes comme 3, il est quelque peu limité pour certains trucs plus cool. Bien sûr, SimpleXML a également perdu ici.

SimpleXMLElement permet de diffuser des sous-types. C'est très spécial en PHP. DOM le permet également, bien que ce soit un peu plus de travail et un type de node plus spécifique doit être choisi.

XPath 1. est pris en charge par les deux, le résultat dans SimpleXML est un array de SimpleXMLElements, dans DOM un DOMNodelist.

SimpleXMLElement prend en charge la conversion en chaîne et tableau (json), les classes DOMNode dans DOM ne le font pas. Ils offrent la conversion en tableau, mais comme tout autre objet (propriétés publiques sous forme de clés/valeurs).

Les modèles d'utilisation courants de ces deux extensions dans PHP sont:

  • Vous commencez normalement à utiliser SimpleXMLElement. Votre niveau de connaissances sur XML et XPath est à un niveau tout aussi bas.
  • Après s'être battu avec la magie de ses interfaces, un certain niveau de frustration est atteint tôt ou tard.
  • Vous découvrez que vous pouvez importer SimpleXMLElements dans DOM et vice-versa. Vous en apprendrez plus sur DOM et comment utiliser l'extension pour faire des choses que vous ne pouviez pas (ou pas savoir comment) faire avec SimpleXMLElement.
  • Vous remarquez que vous pouvez charger des documents HTML avec l'extension DOM. Et XML non valide. Et faites le formatage de sortie. Les choses que SimpleXMLElement ne peut tout simplement pas faire. Pas même avec les sales tours.
  • Vous passez probablement même complètement à l'extension DOM car au moins vous savez que l'interface est plus différenciée et vous permet de faire des choses. Vous voyez également un avantage à apprendre le DOM niveau 1 car vous pouvez également l'utiliser en Javascript et dans d'autres langues (un énorme avantage de l'extension DOM pour beaucoup).

Vous pouvez vous amuser avec les deux extensions et je pense que vous devriez connaître les deux. Plus c'est mieux. Toutes les extensions basées sur libxml dans PHP sont des extensions très bonnes et puissantes. Et sur Stackoverflow sous la balise php il y a une bonne tradition pour bien couvrir ces bibliothèques et aussi avec des informations détaillées.

2
hakre