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
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
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?
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
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.
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
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...
Merci en tous cas pour ces exemples. Si ça créé du besoin, c'est que c'est bon!
Tschuss
Dan