53 votes

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

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

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

98voto

Gordon Points 156415

En bref :

SimpleXml

  • pour un XML simple et/ou des cas d'utilisation simples
  • API limitée pour travailler avec les nœuds (par exemple, il n'est pas possible de programmer sur une interface)
  • tous les nœuds sont du même type (un nœud d'élément est le même qu'un nœud d'attribut)
  • sont accessibles comme par magie, par exemple $root->foo->bar['attribute']

DOM

  • est destiné à tout cas d'utilisation XML que vous pourriez avoir
  • est une implémentation de l'API DOM du W3C (trouvé implémenté dans de nombreuses langues)
  • différencie les différents types de nœuds (plus de contrôle)
  • beaucoup plus verbeux grâce à une API explicite (on peut coder vers une interface)
  • peut analyser du HTML cassé
  • permet d'utiliser des fonctions PHP dans les requêtes XPath

Tous deux sont basés sur libxml et peut être influencée dans une certaine mesure par la Fonctions libxml


Personnellement Je n'aime pas trop SimpleXml. C'est parce que je n'aime pas l'accès implicite aux noeuds, par ex. $foo->bar[1]->baz['attribute'] . Il lie la structure XML réelle à l'interface de programmation. Le type "un nœud pour tout" n'est pas non plus très intuitif, car le comportement du 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 à celle de /foo mais l'exécution d'un écho de ceux-ci produira des résultats différents. De plus, comme ils sont tous deux des éléments SimpleXml, vous pouvez appeler les mêmes méthodes sur eux, mais elles ne seront appliquées que si l'élément SimpleXml le supporte, par exemple en essayant de faire $el->addAttribute('foo', 'bar') sur le premier SimpleXmlElement ne fera rien. Bien sûr, il est exact 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 avis. Faites-vous votre propre opinion :)


Sur un note subsidiaire il n'y a pas deux analyseurs, mais quelques autres en PHP . SimpleXml et DOM sont les deux seuls à analyser un document en une structure arborescente. Les autres sont des analyseurs/lecteurs/écrivains basés sur les événements ou sur l'extraction.

Voir aussi ma réponse à

39voto

Josh Davis Points 12974

Je vais faire la réponse la plus courte possible pour que les débutants puissent la retenir facilement. Je simplifie aussi un peu les choses pour faire court. Allez à la fin de cette réponse pour la version TL;DR exagérée.


DOM et SimpleXML ne sont pas en réalité deux analyseurs différents . Le véritable analyseur est libxml2 qui est utilisé en interne par DOM et SimpleXML. DOM/SimpleXML ne sont donc que deux façons d'utiliser le même analyseur et ils fournissent des moyens de conversion un objet a autre .

SimpleXML est conçu pour être très simple, de sorte qu'il ne comporte qu'un petit nombre de fonctions, et qu'il est axé sur les éléments suivants lecture et écriture de données . C'est-à-dire que vous pouvez facilement lire ou écrire un fichier XML, vous pouvez mettre à jour certaines valeurs ou supprimer certains nœuds ( avec certaines limites ! ), et c'est tout. Pas de manipulation fantaisiste et vous n'avez pas accès aux types de nœuds les moins courants. Par exemple, SimpleXML ne peut pas créer de section CDATA bien qu'il puisse les lire.

DOM offre une la mise en œuvre complète de la DOM ainsi que quelques méthodes non standard telles que appendXML . Si vous avez l'habitude de manipuler le DOM en Javascript, vous trouverez exactement les mêmes méthodes dans le DOM de PHP. Il y a essentiellement aucune limitation dans ce que vous pouvez faire et cela égalise les manipulations HTML. Le revers de la médaille de cette richesse de fonctionnalités est qu'il est plus complexe et plus verbeux que SimpleXML.


Note complémentaire

Les gens se demandent souvent quelle extension ils devraient utiliser pour gérer leur contenu XML ou HTML. En fait, le choix est facile parce qu'il n'y a pas vraiment de choix au départ :

  • si vous devez traiter du HTML, vous n'avez pas vraiment le choix : vous devez utiliser DOM
  • si vous devez faire quelque chose de sophistiqué, comme déplacer des nœuds ou ajouter du XML brut, là encore, vous avez à peu près tout ce qu'il vous faut. avoir pour utiliser DOM
  • si tout ce que vous avez besoin de 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. Ou à la fois .
  • si votre document XML est si gros qu'il ne tient pas dans la mémoire, vous ne pouvez utiliser ni l'un ni l'autre et vous devez utiliser XMLReader qui est également basé sur libxml2, est encore plus ennuyeux à utiliser, mais il est quand même joue bien avec les autres

TL;DR

  • SimpleXML est super facile à utiliser mais ne convient qu'à 90 % des cas d'utilisation.
  • Le DOM est plus complexe, mais il peut tout faire.
  • XMLReader est super compliqué, mais utilise très peu de mémoire. Très pratique.

3voto

IMSoP Points 16089

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

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

L'interface DOM, quant à elle, traite le XML comme un fichier structuré. document 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 types de nœuds 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 textuel, par exemple. La contrepartie est une API assez complexe, avec un grand nombre de classes et de méthodes ; comme il implémente une API standard (développée à l'origine pour manipuler le HTML en JavaScript), la sensation de "PHP naturel" peut être moindre, mais certains programmeurs peuvent être familiers avec cette API dans d'autres contextes.

Les deux interfaces requièrent que le document complet soit analysé en mémoire, et contiennent effectivement des pointeurs vers cette représentation analysée ; vous pouvez même passer d'une interface à l'autre à l'aide de la commande simplexml_import_dom() y dom_import_simplexml() Il est ainsi possible d'ajouter une fonctionnalité "manquante" à SimpleXML à l'aide d'une fonction de l'API DOM. Pour les documents plus volumineux, la fonction XMLReader ou l'approche "événementielle" Analyseur XML peut être plus approprié.

2voto

usoban Points 4015

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

L'extension DOM, quant à elle, est beaucoup plus puissante. Elle vous permet d'analyser presque tous les documents DOM, y compris html, xhtml, xml. Elle permet d'ouvrir, d'écrire et même de corriger le code de sortie, prend en charge xpath et bien d'autres manipulations. 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 projets plus importants où une manipulation lourde des données est nécessaire.

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

2voto

hakre Points 102271

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 classe unique : SimpleXMLElement . En revanche, l'extension DOM comporte de nombreuses classes, dont la plupart sont des sous-types de DOMNode .

La question centrale qui se pose lorsque l'on compare ces deux bibliothèques est donc de savoir laquelle des nombreuses classes offertes par DOM peut être représentée par un élément de type SimpleXMLElement à la fin ?

Le tableau suivant est un tableau comparatif contenant les éléments suivants DOMNode les types qui sont réellement utiles lorsqu'il s'agit de traiter avec XML (types de nœuds utiles). Votre kilométrage peut varier, par exemple lorsque vous devez traiter avec des DTD :

+-------------------------+----+--------------------------+-----------+
| 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     |
+-------------------------+----+--------------------------+-----------+

Comme le montre ce tableau, SimpleXML a des interfaces vraiment limitées par rapport à DOM. A côté de celles du tableau, SimpleXMLElement fait également abstraction de l'accès aux listes d'enfants et d'attributs et permet de parcourir les noms d'éléments (accès aux propriétés) et les attributs (accès aux tableaux). Traversable itérant ses "propres" enfants (éléments ou attributs) et offrant un accès à l'espace de noms via la fonction children() y attributes() des méthodes.

Tant que cette interface magique fonctionne, tout va bien, mais elle ne peut pas être modifiée en étendant SimpleXMLElement, donc aussi magique qu'elle soit, aussi limitée qu'elle soit.

Pour savoir quel type de nœud un objet SimpleXMLElement représente, voir :

DOM suit ici les spécifications du DOMDocument Core Level 1 . Cette interface permet d'effectuer presque toutes les manipulations XML imaginables. Cependant, ce n'est que le niveau 1, donc comparé aux niveaux DOMDocument modernes comme le niveau 3, il est quelque peu limité pour certaines choses plus cool. Il est certain que SimpleXML a perdu ici aussi.

SimpleXMLElement permet la distribution vers des sous-types. C'est très spécial en PHP. DOM le permet également, bien que ce soit un peu plus compliqué et qu'il faille choisir un type de nœud plus spécifique.

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

SimpleXMLElement supporte la conversion en chaîne de caractères et en tableau (json), ce qui n'est pas le cas des classes DOMNode dans DOM. Elles offrent le casting vers les tableaux, mais seulement comme n'importe quel autre objet (propriétés publiques comme clés/valeurs).

Les schémas d'utilisation courants de ces deux extensions en PHP sont les suivants :

  • Vous commencez normalement à utiliser SimpleXMLElement. Votre niveau de connaissance de XML et XPath est tout aussi faible.
  • Après avoir lutté avec la magie de ses interfaces, on atteint tôt ou tard un certain niveau de frustration.
  • Vous découvrez que vous pouvez importer SimpleXMLElement dans DOM et vice-versa. Vous en apprenez plus sur DOM et sur la façon d'utiliser l'extension pour faire des choses que vous ne pouviez pas (ou ne pouviez pas trouver comment) faire avec SimpleXMLElement .
  • Vous remarquez que vous pouvez charger des documents HTML avec l'extension DOM. Et du XML non valide. Et faire du formatage de sortie. Des choses que SimpleXMLElement ne peut tout simplement pas faire. Pas même avec les astuces.
  • Il est probable que vous passiez même à l'extension DOM parce que vous savez au moins que l'interface est plus différenciée et qu'elle vous permet de faire des choses. Vous voyez également un avantage à apprendre le DOM niveau 1 parce que vous pouvez l'utiliser en Javascript et dans d'autres langages (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 il y en a, mieux c'est. Toutes les extensions basées sur libxml en PHP sont de très bonnes et puissantes extensions. Et sur Stackoverflow sous la rubrique php La tradition veut que ces bibliothèques soient bien couvertes et qu'elles contiennent des informations détaillées.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X