[Plan du site]
Vous êtes ici ---
> Le Site du Zéro
> Les tutoriels
> Non-Officiels
> Site Web
> PHP
> Langage, bibliothèques et fonctions
> [DOMXML] Flux RSS de news
> Lecture du tutoriel
[DOMXML] Flux RSS de news
Vous vous apprêtez à lire un tutoriel rédigé par un membre de ce site. Malgré tout le soin que ce membre a pu apporter au tutoriel, nous ne pouvons pas garantir que les informations contenues sur cette page sont exactes à 100%. Merci de garder cela en tête lorsque vous lirez cette page ;o)
Hello, hello !
Vous voulez créer votre propre flux RSS des news de votre site vous-mêmes ?
Vous voulez utiliser une lib XML pour avoir un code plus joli, plus propre, mais vous ne trouvez aucun tuto à ce sujet sur Google ?
J'ai celui qu'il vous faut.
Pour commencer, on va d'abord voir les bases qui me semblent nécessaires pour pouvoir comprendre la suite du tuto, et surtout le fonctionnement de la lib XML.
Elle n'est vraiment pas difficile à comprendre (c'est bien pour ça que je l'utilise

), mais sans quelques mots de vocabulaire, il me semble difficile de la comprendre

.
Prenons par exemple un fichier XML au hasard (bon : pas trop, parce qu'on s'en resservira plus tard

).
Code : XML1
2
3
4
5
6
7
8 | <?xml version="1.0" encoding="ISO-8859-15" ?>
<rss version="2.0">
<channel>
<description>une description</description>
<link>un lien</link>
<title>ho, un titre :D</title>
</channel>
</rss>
|
"
<channel>" est appelée balise. Comme vous le savez, les balises vont par "paires". C'est-à-dire qu'il y a une balise ouvrante, et une balise fermante.
Dans cette exemple avec "
<channel>", la balise ouvrante est "
<channel>", et la balise fermante est "
</channel>".
Il y a aussi les balises auto-fermantes comme "
<img />", mais elles nous intéressent pas dans cet article.
Une balise peut aussi prendre un (ou plusieurs) arguments ; par exemple, "
version" est un argument de la balise "
<rss>" qui a pour valeur "
2.0".
Si vous voulez en savoir plus au sujet du XML,
un excellent article écrit par un Zéro.
Maintenant, voyons un peu la lib que nous allons utiliser pour parser le fichier XML afin de créer notre flux RSS.

On va utiliser DomXML pour PHP4 comme lib

.
Pour la doc officielle, c'est
par ici.
Avec cette doc et de la logique, vous pouvez faire énormément de choses.
Voyons un semblant de vocabulaire pour comprendre un peu le nom des fonctions de DomXML.

Dans notre fichier XML, la balise "
<channel>" est aussi appelée "node" (noeud, en français). Elle fait partie d'un noeud root (noeud parent), ici "
<rss>". On dit aussi que "
<channel>" est une balise fille ou un fils (
child) de "
<rss>".
Donc si vous avez compris, vous avez sans doute trouvé que les balises "
<description>", "
<link>" et "
<title>" sont des enfants de "
<channel>".
En résumé, on a :
- <channel> : appelée "node" dans la lib XML. C'est le node root de <description>
- <description> : appelée "child" dans la lib XML.
La balise "
<channel>" est elle-même un child de "
<rss>". Et ceci peut marcher récursivement pour toutes les balises.

Après avoir vu un peu de vocabulaire utile pour la compréhension du tuto, on va maintenant s'intéresser à la structure que devra avoir le fichier XML pour être lisible par un lecteur de flux RSS.
Prenons comme exemple celui du SdZ.
Structure du début du fichier
Code : XML1
2
3
4
5
6
7
8 | <?xml version="1.0" encoding="ISO-8859-15" ?>
<rss version="2.0">
<channel>
<description>Description du site</description>
<link>lien vers le site</link>
<title>titre du site</title>
</channel>
</rss>
|
C'est la base d'un fichier XML pour être lu par un lecteur de flux RSS. Bien sûr, vous pouvez ajouter des éléments.
A présent, voyons la structure d'un élément (dans notre cas, une news) qui est à mettre entre les balises
<channel></channel> du fichier XML vu au dessus.
Code : XML 1
2
3
4
5
6
7
8
9
10 | <item>
<title>titre de la news</title>
<link>lien vers la news en entier</link>
<description>description de la news, le mieux c'est de mettre le contenu de la news</description>
<comments>un lien vers des commentaires de news</comments>
<author>auteur de la news</author>
<pubDate>date de publication de la news</pubDate>
<guid>texte qui identifie de manière unique la news, le mieux c'est de mettre le titre de la news</guid>
<source>source d'où provient la news</source>
</item>
|
Quelques explications :
Le noeud "
item" va correspondre à UNE news dans la liste des news du fichier XML. C'est-à-dire qu'une fois votre fichier XML construit, vous aurez sans doute quelque chose ressemblant à ceci :
Code : XML1
2
3
4
5
6
7
8
9 | <item>
<!-- titre, lien, etc. de la premiere news -->
</item>
<item>
<!-- titre, lien, etc. de la deuxieme news -->
</item>
<item>
<!-- etc. -->
</item>
|
Voilà : avec cette structure, vous aurez un flux RSS assez complet ; bien sûr, vous pouvez rajouter encore plus de choses.
Une fois qu'on connaît la manière dont est construit le document XML, il est temps de savoir comment récupérer le contenu à lui insérer.
Bah, allons-y.
Tout d'abord, voyons la structure de la table
news servant de modèle pour ce tuto.
Code : SQL1
2
3
4
5
6
7
8 | CREATE TABLE `news` (
`nws_id` smallint(3) UNSIGNED NOT NULL AUTO_INCREMENT,
`nws_pseudo` varchar(255) NOT NULL DEFAULT '0',
`nws_titre` varchar(255) NOT NULL DEFAULT '',
`nws_contenu` text NOT NULL,
`nws_date` int(10) NOT NULL DEFAULT '0',
PRIMARY KEY `id` (`nws_id`),
) TYPE=InnoDB COMMENT='Contient les news' AUTO_INCREMENT=59 ;
|
Cette table n'a rien d'exceptionnel

.
Si vous ne la comprenez pas, vous n'avez pas suivi les cours de M@teo correctement.
Tournons-nous du côté de la requête pour sélectionner les différents éléments.
Code : SQL1 | SELECT nws_id, nws_pseudo, nws_titre, nws_contenu, nws_date FROM news WHERE ORDER BY nws_date DESC LIMIT 0 OFFSET 10
|
Maintenant, il ne nous reste plus qu'à envoyer la requête au serveur mysql.
Code : PHP1
2
3
4
5
6 | <?php
mysql_connect("localhost", "root", "mdp");
mysql_select_db("votre_table");
$nws = mysql_query("SELECT nws_id, nws_pseudo, nws_titre, nws_contenu, nws_date FROM news WHERE ORDER BY nws_date DESC LIMIT 0 OFFSET 10");
?>
|
On sélectionne les 10 dernières news. Libre à vous d'en sélectionner plus ou moins.
Et voilà, ces lignes de code ne devraient pas vous surprendre si vous avez lu le tuto depuis le début.
Il ne vous reste plus qu'à vous souvenir que "
$nws" contient la liste des news que vous voulez mettre dans votre flux RSS

.
Voilà : on est presque arrivé au bout.
Encore quelques minutes d'attention, et vous aurez enfin votre flux RSS.
Voyons la ligne pour initialiser le fichier XML.
Code : PHP1
2
3 | <?php
$xml_file = domxml_new_doc("1.0");
?>
|
On crée juste un fichier XML temporaire en mémoire et on lui indique la version XML du fichier (ici : version 1.0).
A présent, voyons comment créer le noeud maître "
rss", puis un noeud fils "
channel".
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 | <?php
function &init_news_rss(&$xml_file)
{
$root = $xml_file->create_element("rss"); //création de l'element
$root->set_attribute("version", "2.0"); //on lui ajout un attribut
$root = $xml_file->append_child($root); //on l'insère dans le noeud parent (ici root qui est "rss")
$channel = $xml_file->create_element("channel");
$channel = $root->append_child($channel);
$desc = $xml_file->create_element("description");
$desc = $channel->append_child($desc);
$text_desc = $xml_file->create_text_node("Partage de connaissances en tout genre"); //on insère du texte entre les balises <description></description>
$text_desc = $desc->append_child($text_desc);
$link = $xml_file->create_element("link");
$link = $channel->append_child($link);
$text_link = $xml_file->create_text_node("http://www.bougiemind.info");
$text_link = $link->append_child($text_link);
$title = $xml_file->create_element("title");
$title = $channel->append_child($title);
$text_title = $xml_file->create_text_node("Bougie'S mind");
$text_title = $title->append_child($text_title);
return $channel;
}
?>
|
Cette fonction retourne une référence : ainsi, on n'a pas une copie de l'élément, mais bien l'élément créé lui-même.
A ce niveau-là, vous avez un fichier XML (toujours en mémoire) qui devrait ressembler à ceci :
Code : XML1
2
3
4
5
6
7
8 | <?xml version="1.0" encoding="ISO-8859-15" ?>
<rss version="2.0">
<channel>
<description>Partage de connaissances en tout genre</description>
<link>http://www.bougiemind.info</link>
<title>Bougie'S mind</title>
</channel>
</rss>
|
Maintenant, voyons la partie la plus difficile à comprendre, mais simple quand même

.
La création des items (correspondent aux différentes news).
La fonction prend comme argument :
- $parent : contient le fichier XML temporaire
- $root : noeud parent, ici "channel"
- $id : id de la news
- $pseudo : auteur de la news
- $titre : titre de la news
- $contenu : contenu de la news
- $date : date de création de la news
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 | <?php
function add_news_node(&$parent, $root, $id, $pseudo, $titre, $contenu, $date)
{
$item = $parent->create_element("item");
$item = $root->append_child($item);
$title = $parent->create_element("title");
$title = $item->append_child($title);
$text_title = $parent->create_text_node($titre);
$text_title = $title->append_child($text_title);
$link = $parent->create_element("link");
$link = $item->append_child($link);
$text_link = $parent->create_text_node("http://www.bougiemind.info/rss_news".$id.".html");
$text_link = $link->append_child($text_link);
$desc = $parent->create_element("description");
$desc = $item->append_child($desc);
$text_desc = $parent->create_text_node($contenu);
$text_desc = $desc->append_child($text_desc);
$com = $parent->create_element("comments");
$com = $item->append_child($com);
$text_com = $parent->create_text_node("http://www.bougiemind.info/news-11-".$id.".html");
$text_com = $com->append_child($text_com);
$author = $parent->create_element("author");
$author = $item->append_child($author);
$text_author = $parent->create_text_node($pseudo);
$text_author = $author->append_child($text_author);
$pubdate = $parent->create_element("pubDate");
$pubdate = $item->append_child($pubdate);
$text_date = $parent->create_text_node($date);
$text_date = $pubdate->append_child($text_date);
$guid = $parent->create_element("guid");
$guid = $item->append_child($guid);
$text_guid = $parent->create_text_node("http://www.bougiemind.info/rss_news".$id.".html");
$text_guid = $guid->append_child($text_guid);
$src = $parent->create_element("source");
$src = $item->append_child($src);
$text_src = $parent->create_text_node("http://www.bougiemind.info");
$text_src = $src->append_child($text_src);
}
?>
|
Normalement, aucune fonction ne vous est inconnue, elles ont été décrites plus haut.
Voilà à quoi ressemble le bout du fichier xml que vous venez de créer.
J'ai fabriqué une news au hasard.

Code : XML 1
2
3
4
5
6
7
8
9
10 | <item>
<title>Flux RSS des news en place</title>
<link>http://www.bougiemind.info/rss_news56.html</link>
<description>Voila, le flux RSS des news est en place</description>
<comments>http://www.bougiemind.info/news-11-56.html</comments>
<author>bougie</author>
<pubDate>24/04/2006 12:42</pubDate>
<guid>http://www.bougiemind.info/rss_news56.html</guid>
<source>http://www.bougiemind.info</source>
</item>
|
Souvenez-vous que le noeud "item" est un fil du news "channel", donc que les "item" se trouvent entre les balises "<channel></channel>".
Il nous reste plus qu'à créer une boucle sur la fonction "
add_news_node" afin de créer un élément "
item" à chaque fois qu'il y a une news.
Je vous laisse réfléchir.
Vous avez réfléchi.

Bon, je ne vous fais pas patienter plus longtemps.
Code : PHP1
2
3
4
5
6 | <?php
while($news = mysql_fetch_assoc($nws))
{
add_news_node($xml_file, $channel, $news["nws_id"], $news["nws_pseudo"], $news["nws_titre"], $news["contenu"], date("d/m/Y H:i", $news["nws_date"]));
}
?>
|
Le paramètre de la fonction "
add_news_node"
$channel est l'objet retourné par la fonction "
init_news_rss".
Voilà : à présent, il ne reste plus qu'à enregistrer le fichier XML sur le disque dur.
Code : PHP1
2
3 | <?php
$xml_file->dump_file("news_FR_flux.xml");
?>
|
Vous devriez désormais avoir un flux RSS qui fonctionne.
Maintenant qu'on a vu comment faire un flux RSS, on va essayer d'arranger un peu mieux le code qui se balade un peu partout.
Pour faciliter son utilisation lorsque cela sera nécessaire, on va tout regrouper dans un fichier
flux_rss.php.
On va ensuite créer une fonction qui s'occupera de mettre à jour le flux RSS. On va simplement y regrouper les bouts de code qui traînaient un peu partout.
Ce que devrait au final ressemblé à ceci :
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 | <?php
function rebuild_rss()
{
//On se connecte à la BDD
mysql_connect("localhost", "root", "mdp");
mysql_select_db("votre_table");
//On récupère les news
$nws = mysql_query("SELECT nws_id, nws_pseudo, nws_titre, nws_contenu, nws_date FROM news WHERE ORDER BY nws_date DESC LIMIT 0 OFFSET 10");
//On crée le fichier XML
$xml_file = domxml_new_doc("1.0");
//On ajoute chaque news au fichier RSS
while($news = mysql_fetch_assoc($nws))
{
add_news_node($xml_file, $channel, $news["nws_id"], $news["nws_pseudo"], $news["nws_titre"], $news["contenu"], date("d/m/Y H:i", $news["nws_date"]));
}
//On écrit le fichier
$xml_file->dump_file("news_FR_flux.xml");
}
?>
|
Voilà : vous avez une fonction qui, à chaque fois que vous l'appellerez, reconstruira votre flux RSS.
Si on récapitule, vous devriez avoir un fichier
flux_rss.php comme celui-ci :
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99 | <?php
function &init_news_rss(&$xml_file)
{
$root = $xml_file->create_element("rss"); //création de l'element
$root->set_attribute("version", "2.0"); //on lui ajoute un attribut
$root = $xml_file->append_child($root); //on l'insère dans le noeud parent (ici root qui est "rss")
$channel = $xml_file->create_element("channel");
$channel = $root->append_child($channel);
$desc = $xml_file->create_element("description");
$desc = $channel->append_child($desc);
$text_desc = $xml_file->create_text_node("Partage de connaissances en tout genre"); //on insère du texte entre les balies <description></description>
$text_desc = $desc->append_child($text_desc);
$link = $xml_file->create_element("link");
$link = $channel->append_child($link);
$text_link = $xml_file->create_text_node("http://www.bougiemind.info");
$text_link = $link->append_child($text_link);
$title = $xml_file->create_element("title");
$title = $channel->append_child($title);
$text_title = $xml_file->create_text_node("Bougie'S mind");
$text_title = $title->append_child($text_title);
return $channel;
}
function add_news_node(&$parent, $root, $id, $pseudo, $titre, $contenu, $date)
{
$item = $parent->create_element("item");
$item = $root->append_child($item);
$title = $parent->create_element("title");
$title = $item->append_child($title);
$text_title = $parent->create_text_node($titre);
$text_title = $title->append_child($text_title);
$link = $parent->create_element("link");
$link = $item->append_child($link);
$text_link = $parent->create_text_node("http://www.bougiemind.info/rss_news".$id.".html");
$text_link = $link->append_child($text_link);
$desc = $parent->create_element("description");
$desc = $item->append_child($desc);
$text_desc = $parent->create_text_node($contenu);
$text_desc = $desc->append_child($text_desc);
$com = $parent->create_element("comments");
$com = $item->append_child($com);
$text_com = $parent->create_text_node("http://www.bougiemind.info/news-11-".$id.".html");
$text_com = $com->append_child($text_com);
$author = $parent->create_element("author");
$author = $item->append_child($author);
$text_author = $parent->create_text_node($pseudo);
$text_author = $author->append_child($text_author);
$pubdate = $parent->create_element("pubDate");
$pubdate = $item->append_child($pubdate);
$text_date = $parent->create_text_node($date);
$text_date = $pubdate->append_child($text_date);
$guid = $parent->create_element("guid");
$guid = $item->append_child($guid);
$text_guid = $parent->create_text_node("http://www.bougiemind.info/rss_news".$id.".html");
$text_guid = $guid->append_child($text_guid);
$src = $parent->create_element("source");
$src = $item->append_child($src);
$text_src = $parent->create_text_node("http://www.bougiemind.info");
$text_src = $src->append_child($text_src);
}
function rebuild_rss()
{
//On se connecte à la BDD
mysql_connect("localhost", "root", "mdp");
mysql_select_db("votre_table");
//On récupère les news
$nws = mysql_query("SELECT nws_id, nws_pseudo, nws_titre, nws_contenu, nws_date FROM news WHERE ORDER BY nws_date DESC LIMIT 0 OFFSET 10");
//On crée le fichier XML
$xml_file = domxml_new_doc("1.0");
//On initialise le fichier XML pour le flux RSS
$channel = init_news_rss($xml_file);
//On ajoute chaque news au fichier RSS
while($news = mysql_fetch_assoc($nws))
{
add_news_node($xml_file, $channel, $news["nws_id"], $news["nws_pseudo"], $news["nws_titre"], $news["contenu"], date("d/m/Y H:i", $news["nws_date"]));
}
//On écrit le fichier
$xml_file->dump_file("news_FR_flux.xml");
}
?>
|
Voilà, il vous suffira à présent de rajouter 2 lignes de code pour que votre flux RSS soit reconstruit :
Code : PHP1
2
3
4 | <?php
require('flux_rss.php');
rebuild_rss();
?>
|
Il ne vous reste plus qu'à indiquer au navigateur que votre site possède un flux RSS.
Une simple ligne en xHTML suffit.
Code : HTML1 | <link rel="alternate" type="application/rss+xml" title="{Titre du flux RSS}" href="{Lien vers le flux RSS}" />
|
{Titre du flux RSS} et {Lien vers le flux RSS} sont bien sûr à remplacer par ce que vous voulez.
Pour ceux qui souhaitent utiliser mon code avec PHP5, il y a quelques trucs à changer.
C'est principalement le nom des méthodes qui change.
Ce n'est plus DOMXML le nom de la lib XML, mais simplement DOM.
Un lien vers la doc.
Je ne vais pas recopier le code en changeant tout, parce que le code est quand même très répétitif.
La fonction "
create_element" est à remplacer par "
createElement".
La fonction "
set_attribute" est à remplacer par "
setAttribute".
La fonction "
append_child" est à remplacer par "
appendChild".
La fonction "
create_text_node" est à remplacer par "
createTextNode".
Ce qui nous donnerait par exemple pour la fonction
&init_news_rss(&$xml_file) :
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 | <?php
function &init_news_rss(&$xml_file)
{
$root = $xml_file->createElement("rss"); //création de l'élément
$root->setAttribute("version", "2.0"); //on lui ajoute un attribut
$root = $xml_file->appendChild($root); //on l'insère dans le noeud parent (ici root qui est "rss")
$channel = $xml_file->createElement("channel");
$channel = $root->appendChild($channel);
$desc = $xml_file->createElement("description");
$desc = $channel->appendChild($desc);
$text_desc = $xml_file->createTextNode("Partage de connaissances en tout genre"); //on insère du texte entre les balies <description></description>
$text_desc = $desc->appendChild($text_desc);
$link = $xml_file->createElement("link");
$link = $channel->appendChild($link);
$text_link = $xml_file->createTextNode("http://www.bougiemind.info");
$text_link = $link->appendChild($text_link);
$title = $xml_file->createElement("title");
$title = $channel->appendChild($title);
$text_title = $xml_file->createTextNode("Bougie'S mind");
$text_title = $title->appendChild($text_title);
return $channel;
}
?>
|
A vous ensuite de modifier les autres fonctions. Je vous fais confiance.
Les dernières modifications vont se faire au niveau de la création du fichier XML et de sa sauvegarde.
Dans notre code PHP4, on avait :
Code : PHP1
2
3 | <?php
$xml_file = domxml_new_doc("1.0");
?>
|
En PHP5, il faut faire comme ça :
Code : PHP1
2
3 | <?php
$xml_file = new DOMDocument("1.0");
?>
|
Et pour sauvegarder le fichier XML...
En PHP4 :
Code : PHP1
2
3 | <?php
$xml_file->dump_file("news_FR_flux.xml");
?>
|
En PHP5 :
Code : PHP1
2
3 | <?php
$xml_file->save("news_FR_flux.xml");
?>
|
Voilà : vous avez un code qui fonctionnera sur un serveur avec PHP5.

Et n'oubliez pas : tout ce que je vous ai dit ici, je l'ai trouvé dans la doc.
Vous devriez maintenant être capables de coder votre propre flux RSS des news de votre site en vous servant d'une lib XML.
Merci de m'avoir lu, et à bientôt pour de nouvelles aventures.
P.-S. : à ceux qui veulent finaliser le tuto en ajoutant ce qui a été dit dans les commentaires, envoyez-moi un MP.