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 ?
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 ?
En bref :
SimpleXml
$root->foo->bar['attribute']
DOM
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 à
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.
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 :
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é.
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 :)
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 |
+-------------------------+----+--------------------------+-----------+
[1]
: Le langage SimpleXML présente les nœuds de texte sous la forme de __toString
). Cela ne fonctionne bien que lorsqu'un élément ne contient que du texte, sinon l'information textuelle peut être perdue.[2]
: Chaque analyseur XML peut développer les nœuds CDATA lors du chargement du document. SimpleXML LIBXML_NOCDATA
option i simplexml_load_*
fonctions ou le constructeur . [ ] DOMDocument::loadXML()
)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).
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 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 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.