Skip to main content

Tutoriel: Insérer un flux RSS dans une page ASP.net

Nous allons ici voir comment rapidement incorporer un flux RSS dans un formulaire Web ASP.net. Plus exactement, nous allons nous abonner à un flux Atom.

Le but est d'afficher en tant que HTML les titres des entrées du flux, avec les liens vers les articles, et d'incorporer le tout au formulaire Web, comme je le fais sur ma page:

Dans cet exemple, nous prendrons le flux RSS provenant de l'URL http://arnaudweil.blogspot.com/rss.xml.

Puisque le RSS est du XML, nous allons facilement pouvoir le transformer en HTML grâce au contrôle ASP.net Xml et à une transformation XSLT.

Dans ma page blog.aspx, j'écris donc:

<asp:Xml ID="Xml1" runat="server" TransformSource="~/rss2table.xsl" />

Il me faut ensuite créer la transormation XSLT. J'ajoute donc à la racine de mon site un fichier rss2table.xsl avec le contenu suivant (cliquez avec le bouton droit sur le nom du projet dans l'Explorateur de Solutions de Visual Studio et choisissez "Ajouter un nouvel élément" puis "Fichier XSLT"):

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:template match="/atom:feed">
<table>
<tr>
<th>Titre</th>
<th>Date</th>
</tr>
<xsl:apply-templates select="atom:entry" />
</table>
</xsl:template>
<xsl:template match="atom:entry">
<tr>
<td>
<a href="{atom:link[@rel='alternate']/@href}">
<xsl:value-of select="atom:title"/>
</a>
</td>
<td>
<xsl:value-of select="substring(atom:published,0,11)"/>
</td>
</tr>
</xsl:template>
</xsl:stylesheet>

Il ne reste qu'un détail: le contrôle XML doit récupérer le flux RSS. Mais il ne sait que travailler avec un document XML local ou une chaîne. Aucun problème, il est très facile de faire une requête HTTP avec le framework .net. J'ajoute donc au code de ma page (blog.aspx.cs) le code suivant:

protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
WebRequest r = HttpWebRequest.Create("http://arnaudweil.blogspot.com/rss.xml");
WebResponse re = r.GetResponse();
using (StreamReader sr = new StreamReader(re.GetResponseStream()))
{
Xml1.DocumentContent = sr.ReadToEnd();
}
}
}

Et c'est tout! Facile, n'est-ce pas?

Comments

danisti said…
Hello,

j'essaie de faire fonctionner ton example mais je ne vois jamais tomber la balise /atom:feed dans ton flux xml. J'ai raté qlq chose ou bien il y a un problème?

Merci d'avance

dan
Arnaud said…
Bonjour Dan,

Regarde en haut du flux, il doit y avoir une directive
xmlns:atom='http://www.w3.org/2005/Atom'

Sauf que c'est sûrement autre chose que "atom". Il suffit de remplacer "atom" par cet autre chose dans le XSL/T que je fournis.

Par exemple, s'il y a:
xmlns:toto='http://www.w3.org/2005/Atom'

alors le:
match="atom:entry"
devient:
match="toto:entry"

Est-ce que ça résout ton problème?
danisti said…
houuula...
Milles excuses, je pensais mal au sujet du xsl. C'est un langage à part entière pour xslt et je débute.
En fait, le flux que je voulais segmenter ne correspond apparemment pas à cette "atomisation?". En tous cas, il ne contient que du xml assez simple et similaire à ton flux, si ce n'est pour les balises atom...
J'ai combiné ton code avec celui de la MSDN et avec un bête foreach, je traite les balises qui m'intéressent dans le flux et les affichent en tableau, avec lien sur le titre. J'ai juste fait appel aux balises du xml d'entrée.

Merci pour ton exemple, mais force est de constater que je n'ai pas bien compris ta réponse :-D

Dan
Arnaud said…
Désolé si la réponse n'était pas claire...

En utilisant XSLT pour transformer la source (du XML) en HTML, je souhaite éviter d'écrire du code .NET pour cela. Mais rien n'empêche d'en écrire, comme tu l'as finalement fait.

Je suis quand même curieux de connaître le flux que tu voulais convertir... tu me donnes l'URL? Par e-mail, si tu ne veux pas qu'elle apparaisse ici.
danisti said…
Je n'ai pas eu à écrire plus de code c#, c'est ça qui est cool!

Ton exemple m'a bien servi, surtout pour les appels aux fonctions de requêtes web pour la mise à jour du contrôle asp et pour la création du xsl (il me manquait System.Net mais VS m'a vite fait indiqué le using manquant). Je n'ai fait que modifier celui-ci d'ailleurs, pour lui faire afficher les balises "item" et leurs enfants, sous la forme du tableau de lien que tu montrais.

Tiens, c'est du xml tt bête : http://fr.audiofanzine.com/news/partenaires/rss.xml
Arnaud said…
Eh bien je suis content de savoir que tu aies réussi, et que c'est en modifiant le XSL/T... car c'est bien ce qu'il fallait faire.

En fait, mon exemple montre comment traiter un flux Atom, pas un flux RSS, mais c'est presque la même chose.

Sinon, il y a aussi l'option d'appliquer une autre transformation XSLT/T, qui est données ici, pour convertir le RSS en Atom, puis d'appliquer le XSL/T que je donne...
danisti said…
hmmm, j'avoue que l'intéret de la réutilisabilité se manifeste sur ce point : la possibilité d'appliquer un même modèle pour transformer n'importe quel flux, qu'il soit bêtement RSS ou bien qu'il soit conforme à une nomenclature précise telle que celle des flux Atom, dont je n'avais pas connaissance jusqu'à présent, m'interpelle. Je vais voir si je peux mettre ça en application avec des webforms pour permettre à mes utilisateurs de se créer un zône de contenu dynamique à partir de n'importe quelle source d'info, à la gmail.

Merci en tous cas pour ces exemples. Si ça créé du besoin, c'est que c'est bon!

Tschuss

Dan

Popular posts from this blog

Learn Meteor book available

I'm pleased to announce the general release of my Learn Meteor book. It is now available as an ebook or print book from various sources: Learn Meteor print (paperback) on Lulu Learn Meteor ebook on LeanPub Learn Meteor ebook on Barnes & Noble Learn Meteor ebook on iBooks Learn Meteor ebook on Kobo Learn Meteor ebook on Scribd Learn Meteor ebook on Inktera Page Foundry Learn Meteor ebook on 24symbols Learn Meteor ebook on Amazon US Learn Meteor ebook on Amazon UK Learn Meteor ebook on Amazon France Learn Meteor ebook on Amazon Deutschland Learn Meteor ebook on Amazon Canada Learn Meteor ebook on Amazon India Learn Meteor ebook on Amazon Brasil Learn Meteor ebook on Amazon Mexico Learn Meteor ebook on Amazon España Learn Meteor ebook on Amazon Italia Learn Meteor ebook on Amazon Netherlands Learn Meteor ebook on Amazon Japan Learn Meteor ebook on Amazon Australia More sources are coming soon for the print version. Learn Meteor has been a fun experienc

Gift idea : help your loved ones take their IT skills to the next level

You surely know a special person who works in IT. Learn Kubernetes & Docker enables them to quickly ramp up on those two technologies that one doesn't want to miss in 2021. With smoother operations, better scaling and availability, DevOps tooling, containers and containers orchestration smartly solve many problems that developers and system administrators commonly face. Don't let your loved ones face problems in their IT job : offer them the book that takes them from zero to productive in a matter of days. Grab it now! Get the ebook from Leanpub , Amazon or choose from many retailers . Get the print edition from Lulu .  

Vue semaine gratuite pour Windows Phone 7.5

J’ai le plaisir d’annoncer la disponibilité sur le marketplace de mon application Free Week Calendar . C’est la première application gratuite à vous fournir une vue semaine de vos rendez-vous. L’utilisation est aussi simple que fluide. Par défaut vos rendez-vous de la semaine courante sont affichés (les copies d’écran sont en anglais mais l’application est intégralement localisée en français): En glissant le doigt à gauche ou à droite vous obtenez la semaine suivante ou précédente. En écartant les doigts vous zoomez sur vos rendez-vous, et en les rapprochant vous revenez à la vue globale. Contrairement à d’autres applications, celle-ci est entièrement localisée pour fonctionner en français et respecter le lundi comme premier jour de la semaine. P.S: merci à l’ Accélérateur Windows Phone et Dalhia pour leur aide. Sans eux cette application aurait mis plus de temps à sortir.