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?
En un mot:
SimpleXml
$root->foo->bar['attribute']
[~ # ~] dom [~ # ~]
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 à
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.
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:
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é.
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 :)
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).
SimpleXMLElement
s 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 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.