Introduction

XML est un moyen fantastique pour échanger des données. La structure en arbre des documents permet d'organiser, de 'stocker' puis d'utiliser des informations comme on le ferait habituellement avec une base de données relationelle.

Je vais vous proposer une solution trés utile pour 'parser' un document XML et remplir sa base de données sous MySQL.

Première partie : Analyse de la structure du document XML

Je prend l'exemple de la FAQ de PHPIndex en XML

<CHAPTER ID="1" title="Généralités">

	<QUESTION ID="1.1">Qu'est-ce que PHP</QUESTION>
	<ANSWER>PHP est un langage de script. Ses nombreux atouts (code directement intégré aux pages HTML, richesse des fonctions, facilité de connexion à l'ensemble de SGBD du marché, etc.) en font une solution idéale pour le développement de sites Web dynamiques...</ANSWER>

	<QUESTION ID="1.4">Sur quelle architecture puis-je faire tourner PHP</QUESTION>
	<ANSWER>Unix ou NT.</ANSWER>

	<QUESTION ID="1.6">Qu'est ce qui le distingue de Perl</QUESTION>
	<ANSWER>L'approche est différente. De plus Perl existe depuis beaucoup plus longtemps que PHP. Il en résulte une importante base de connaissance (scripts, librairies et modules, documentations, etc.)...</ANSWER>

</CHAPTER>
On remarque plusieurs informations qui vont nous permettrent de réaliser le modèle conceptuel des données de la base. La balise qui possède comme attribut un identifiant et un titre contient plusieurs questions et réponses .
On va pouvoir réaliser deux tables : la première s'appelera 'chapter' et la seconde 'contenu'.

Soit le dictionnaire des données :
chapter (id, titre);
contenu (id, id_chapter, question, reponse);
'question' et 'reponse' sont des types TEXT, et 'titre' est un VARCHAR(255) ; 'id_chapter' prend pour valeur l'id de la table 'chapter' auquel la question est liée.

Deuxième Partie : Parser le document XML

Notre base et nos tables réalisées, le but maintenant est de récupérer le contenu du document XML pour l'insérer dans la base.

Pour cela il existe deux méthodes : la première est de parser grâce aux fonctions XML de PHP (voir article précédent), et la seconde est d'utiliser les expressions régulières PERL qui sont trés efficaces si on sait bien les utiliser.

Je ne reviendrais pas sur l'article précédent "Décomposer un document XML grâce à PHP" par contre je vais faire un petit topo sur les fonctions PCRE qu'offre PHP.

Remplissont la table chapter : pour cela j'ai besoin de récupérer tous les attributs title des balises chapter et de les insérer dans la table, utilisons la fonction preg_match_all().

	$file = "faq.xml";
	$contenu = fread(fopen($file, "r"), filesize($file));
	preg_match_all("|<CHAPTER ID=\"\d\" title=\"(.*)\">|U", $contenu, $titre);

	/* le \d signifie n'importe quelle décimale */
	/* le .* signifie n'importe quel caractère '.' présent de 0 à n fois '*' */
Cette fonction remplie un tableau '$titre' contenant l'expression régulière trouvée entre les parenthèses.

	for($j=0;$j<count($titre[1]);$j++){
		$sql_query = "INSERT INTO chapter SET titre='".$titre[1][$j]."' ";
	}
Vous avouerez que ce n'est pas si compliqué :))

Conclusion

Cette procédure devient utile quand on doit récupérer le contenu d'une base sans les caractéristiques de chaque table (indices, index, clés etc...) ou si on veut sélectionner une partie seulement du contenu.

A la prochaine...

Consulter le lien