« Programmation PHP/Exemples/DomXml » : différence entre les versions

Contenu supprimé Contenu ajouté
+ Sommaire + ortho + formulation + niveau des titres + accents
Ligne 1 :
{{Programmation PHP}}
Les xmldocument au format XML ont des concaténations imbriquéesimbrications parfois complexes et il n'est pas rare de devoir avoir recours à plusieurs fonctions pour faire le travail de décapsulation du contenu.
 
AÀ travers cet exemple pratique nous écrirons une fonction pour convertir tout xmldocument XML en tableau suivant l'approche du web2 qui tient en deux tags très galvaudés [meta] et [data].
 
==Objectif==
 
* ElaborerÉlaborer une fonction permettant de convertir en tableaux tout xml bien formé.
* Créer une classe utilitaire domxml pour la recevoir avec ses petites soeurs.
 
=Ecriture=Écriture d'un xml complexe==
 
** EcritureÉcriture d'un xml valide à imbrications multiples aux tags hétéroclites attribuéscomportant des attributs ou non...
 
<pre>
 
<?xml version="1.0" encoding="UTF-8"?>
<root>
<tag1 m1="attTag1" m2="att2"><sous-tag1>texte sous-tag1<sous-tag2></sous-tag2>texte tag1</sous-tag1>
</tag1>
</tag1>
<tag1><sous-tag1>texte sous-tag1<sous-tag2 att1="att2" att3="att3"></sous-tag2></sous-tag1>
<tag3> <sous-tag1>texte sous-tag1<sous-tag2 att1="att2" att3="att3"></sous-tag2 att1="attribut1"></sous-tag1>
<etEncoreUnTagSuperflutag3><sous-tag1>texte sous-tag1<sous-tag2>test</sous-tag2 att1="attribut1"></sous-tag1>
<tag1><p><betEncoreUnTagSuperflu><sous-tag1>texte sous-tag1<sous-tag2 att1="attribut1" />test</bsous-tag2></sous-tag1>
<tag1><p><b><sous-tag1>texte sous-tag1<sous-tag2 att1="att2attribut1" att3="att3"/></sous-tag2b></sous-tag1>
ceci</p>est du body texte à extraire
</tag1>
</tag1>
</etEncoreUnTagSuperflu>
text de début ou de fin
</tag3>
</tag1>
<tagNfo id="1" description="description">texteDescription</tagNfo>
</root>
 
</pre>
 
** Sauvegarde de ce document.xml bien formé dans le même répertoire.
 
=Creation=Création de la fonction==
 
On doit maintenant écrire une fonction, la plus optimale possible, pour migrercharger document.xml dans un tableau...
 
Cette fonction doit :
** recevoir en entrée un flux xml/rss valide
** doit migrer les attributs et le contenu dans un tableau
 
On écrit la fonction récursive qui décapsulera chaqueschaque tagstag en deux sous-tableaux par tag ([meta] ou attibuts ) et ( [data] ou noeud text )
** recevoir en entrée un flux xml/rss valide
** doit migrer les attributs et le contenu dans un tableau
 
On écrit la fonction récursive qui décapsulera chaques tags en deux sous-tableaux par tag ([meta] ou attibuts ) et ( [data] ou noeud text )
 
Cette fonction doit :
** tester le type de noeud (text ou tag)
 
** ? si textetag >extraire letous texteses attributs dans >[datameta]
** tester le type de noeud (text ou tag)
** ? si tagtexte >extraire tousle ses attributstexte dans >[metadata]
** comme la structure est imbriquée et non listée :
** ? si texte >extraire le texte dans >[data]
*** les tags de débuts et de fins ne se suivent pas...
** comme la structure est imbriquée et non listée :
*** la fonction sera donc récursive et s'appellera elle-même pour un output [[lifo]]. Elle devra donc se passer son propre résultat en paramètre
*** les tags de débuts et de fins ne se suivent pas...
*** par soucis du détail technique on fera une fonction getAttribute() pour optimiser le code
*** la fonction sera donc récursive et s'appellera elle-même pour un output [[lifo]]
**** elle devra donc se passer son propre résultat en paramètre
*** par soucis du détail technique on fera une fonction getAttribute() pour optimiser le code
 
<pre>
function getAttribute($node)
{// >((dom)node) ((array)tab)>
Ligne 70 ⟶ 66 :
return $tab;
}//
 
</pre>
 
Description :
**Pour chaque attributsattribut, on place le contenu à une clé du tableau tab à retourner.
 
On s'attaque ensuite au plus gros du travail de notre convertisseur à savoir domxml2array():
 
<pre>
 
function domxml2array($node,&$tab,&$i)
{// >((dom)node, (array)tab, (int)i) ((array)tab)>
Ligne 104 ⟶ 98 :
 
Description :
# si le premier child existe
 
**# sion test le premiertype childde existenoeud
**# on testpasse leau typenoeud de noeudsuivant
**# on passe au noeud suivant
 
La fonction utilitaire print_r_html disponible sur php.net permettra de déposer le contenu à l'écran :
Ligne 127 ⟶ 120 :
</pre>
 
==Création de la classe==
On élabore une classe utilitaire pour php4 à implémenter au fur et à mesure :
** On la baptise DomTree
 
** On y implémente les fonctions créées...
** On la baptise DomTree
** On y implémente les fonctions créées...
 
<pre>
Ligne 206 ⟶ 198 :
 
?>
 
</pre>
 
==Application==
 
Dans un fichier test.php on instantieinstancie la classe et on l'executeexécute:
 
<pre>
 
<?php
 
Ligne 223 ⟶ 213 :
$doc = new DomTree('document.xml');
 
// selectionsélection du noeud
$root = $doc->getTag('root');
Ligne 233 ⟶ 223 :
 
?>
 
</pre>
 
==Aperçu==
On obtient un arbre structuré easy2use pour le web2
<pre>
 
<pre>
Array
(
Ligne 416 ⟶ 405 :
 
)
 
</pre>
 
==En bref==
On a une fonction fort utile à porter sur php5 ou à optimiser histoire de ne plus avoir d'incréments dans les données du tableau...