<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
"http://openweb.eu.org/dtd/docbkx42/docbookx.dtd">
<article lang="fr" id="rss_construction10" role="article">
  <articleinfo>
    <title>Construction d'un fil RSS 1.0</title>
    <author>
      <firstname>François</firstname>
      <surname>Hodierne</surname>
    </author>
    <legalnotice>
      <para>Cet article est sous licence <ulink url="http://creativecommons.org/licenses/by-sa/1.0/legalcode">Creative Commons Attribution-ShareAlike</ulink>.</para>
    </legalnotice>
    <abstract>
      <para>Pas à pas, comment construire un fil <acronym>RSS</acronym> au format RDF Site Summary 1.0.</para>
    </abstract>
    <pubdate>2004-10-14</pubdate>
    <date>2004-10-14</date>
    <subjectset>
      <subject role="profil">
        <subjectterm>expert</subjectterm>
        <subjectterm>debutant</subjectterm>
      </subject>
      <subject role="technologie">
        <subjectterm>rss</subjectterm>
      </subject>
      <subject role="theme" />
    </subjectset>
  </articleinfo>
  <para>Cet article fait suite à
  l'<ulink url="/articles/rss_introduction/">Introduction à RSS</ulink> et
  reprend en particulier son exemple de fil <acronym>RSS</acronym>
  des publications d'OpenWeb.</para>
  <para>La <ulink url="http://web.resource.org/rss/1.0/spec">spécification 
  <acronym>RSS</acronym> 1.0</ulink>, datée de décembre 2000, a été créée par
  un groupe de travail indépendant. Selon cette spécification, 
  <acronym>RSS</acronym> 1.0 est <quote>un format de syndication et de
  description de métadonnées léger, universel et extensible</quote>.
  Il se base intégralement sur la spécification <acronym>RDF</acronym> du 
  <acronym>W3C</acronym>, en adoptant une structure modulaire basée sur les
  espaces de noms <acronym>XML</acronym>.</para>
  <section>
    <title>Changements par rapport à <acronym>RSS</acronym> 0.91</title>
    <itemizedlist>
      <listitem>
        <para>La déclaration de <acronym>DTD</acronym> disparaît.</para>
      </listitem>
      <listitem>
        <para>La racine <acronym>XML</acronym> devient :</para>
        <programlisting><![CDATA[<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://purl.org/rss/1.0/">]]></programlisting>
        <para>Il faut donc désormais clore le fil par 
        <sgmltag class="endtag">rdf:RDF</sgmltag> et non plus par 
        <sgmltag class="endtag">rss</sgmltag>.</para>
      </listitem>
      <listitem>
        <para>La balise <sgmltag>channel</sgmltag> se voit ajouter un
	attribut obligatoire <sgmltag class="attribute">rdf:about</sgmltag>
	qui aura comme valeur l'<acronym>URI</acronym> du feed. Le plus
	souvent, on prendra l'<acronym>URL</acronym> du site ou
	l'<acronym>URL</acronym> du fichier <acronym>RSS</acronym> :</para>
        <programlisting><![CDATA[<channel rdf:about="http://www.openweb.eu.org">]]></programlisting>
        <para>La balise <sgmltag>item</sgmltag> se voit aussi ajouter cet
	attribut obligatoire <sgmltag class="attribute">rdf:about</sgmltag>
	qui aura comme valeur l'<acronym>URI</acronym> de l'élément,
	c'est-à-dire, là encore, le plus souvent son
	<acronym>URL</acronym> :</para>
        <programlisting><![CDATA[<item rdf:about="http://openweb.eu.org/articles/png_vs_gif/">
<title>Le PNG face au GIF</title>
<link>http://openweb.eu.org/articles/png_vs_gif/</link>
<description>Qui est donc ce remplaçant du GIF, datant de 1996 et
méconnu de la plupart des graphistes, amateurs comme
professionnels&#160;?</description>
</item>]]></programlisting>
        <para>Comme la valeur de ce paramètre
	<sgmltag class="attribute">rdf:about</sgmltag> est une
	<acronym>URI</acronym>, il est entendu qu'elle est unique dans le temps
        et ne doit pas varier. C'est en effet ce paramètre qui permet
        d'identifier d'une manière certaine l'élément.</para>
      </listitem>
      <listitem>
        <para>La balise <sgmltag>language</sgmltag> disparaît.</para>
      </listitem>
      <listitem>
        <para>Le changement le plus marquant est sans doute la présence
        obligatoire d'une <emphasis>table des matières</emphasis> en début
	de fichier avec la liste des éléments décrits dans le fil 
        <acronym>RSS</acronym>. Cette table des matières prendra la forme
        suivante :</para>
        <programlisting><![CDATA[<items>
<rdf:Seq>
<rdf:li rdf:resource="http://openweb.eu.org/articles/png_vs_gif/"/>
<rdf:li rdf:resource="http://openweb.eu.org/articles/initiation_css/"/>
<rdf:li rdf:resource="http://openweb.eu.org/articles/interview_ned_baldessin/"/>
</rdf:Seq>
</items>]]></programlisting>
        <para>Les valeurs <sgmltag class="attribute">rdf:ressource</sgmltag>
	doivent correspondre aux valeurs
	<sgmltag class="attribute">rdf:about</sgmltag> des
	<sgmltag>item</sgmltag> correspondants.</para>
      </listitem>
      <listitem>
        <para>La clôture de l'élément <sgmltag>channel</sgmltag> est déplacée.
	On le ferme désormais avant le premier <sgmltag>item</sgmltag> et non
	plus après le dernier <sgmltag>item</sgmltag>.</para>
      </listitem>
    </itemizedlist>
    <para>Le <ulink url="annexes/exemple_RSS_091.xml">document 
    <acronym>RSS</acronym> 0.91</ulink> que nous avions créé précédemment
    devient ainsi <ulink url="annexes/exemple_RSS_1.xml">un premier exemple
    de feed <acronym>RSS</acronym> 1.0 minimal</ulink> (le fichier est
    commenté).</para>
  </section>
  <section>
    <title>Les modules</title>
    <section>
      <title>Un mécanisme d'extensivité</title>
      <para>Les concepteurs de <acronym>RSS</acronym> 1.0 ont pris le parti
      de s'en tenir à un noyau de spécification aussi simple que possible.
      Ainsi, pour la description d'un élément, il n'existe que trois éléments
      (<sgmltag>title</sgmltag>, <sgmltag>link</sgmltag> et
      <sgmltag>description</sgmltag>). Pour aller plus loin et enrichir
      les (méta)données, ils ont decidé que tout se passerait via des 
      <emphasis>modules</emphasis> qui permettent à <acronym>RSS</acronym>
      d'être étendu :</para>
      <blockquote>
        <itemizedlist>
          <listitem>
            <para>sans nécessiter des réécritures itératives de la
            spécification du noyau ;</para>
          </listitem>
          <listitem>
            <para>sans qu'un consensus soit nécessaire pour chaque
            élément ;</para>
          </listitem>
          <listitem>
            <para>sans alourdir <acronym>RSS</acronym> avec des éléments qui,
            en majorité, resteraient inutilisés dans la plupart des domaines
            et des applications.</para>
          </listitem>
        </itemizedlist>
      </blockquote>
      <para>Cette modularisation est accomplie en utilisant les 
      <emphasis>espaces de noms <acronym>XML</acronym></emphasis>. Dès lors,
      ajouter ou supprimer des fonctionnalités <acronym>RSS</acronym> revient
      simplement à inclure un ensemble spécifique de modules, les plus adaptés
      à la tâche à accomplir. Les modules les plus répandus sont :</para>
      <table>
        <title>Modules</title>
        <tgroup cols="3">
          <thead>
            <row>
              <entry>Nom</entry>
              <entry>Statut</entry>
              <entry>Usage</entry>
            </row>
          </thead>
          <tbody>
            <row>
              <entry>
                <ulink url="http://web.resource.org/rss/1.0/modules/dc/">Dublin
                Core</ulink>
              </entry>
              <entry>Officiel</entry>
              <entry>définir des méta-données comme des dates, des auteurs, des
              mots-clefs&#8230;</entry>
            </row>
            <row>
              <entry>
                <ulink url="http://web.resource.org/rss/1.0/modules/syndication/">Syndication</ulink>
              </entry>
              <entry>Officiel</entry>
              <entry>donner des indications sur la fréquence de mise à
              jour</entry>
            </row>
            <row>
              <entry>
                <ulink url="http://web.resource.org/rss/1.0/modules/content/">Content</ulink>
              </entry>
              <entry>Officiel</entry>
              <entry>associer le contenu complet d'un article</entry>
            </row>
            <row>
              <entry>
                <ulink url="http://web.resource.org/rss/1.0/modules/admin/">Admin</ulink>
              </entry>
              <entry>Proposé</entry>
              <entry>donne des indications sur le générateur du fil 
              <acronym>RSS</acronym></entry>
            </row>
            <row>
              <entry>
                <ulink url="http://web.resource.org/rss/1.0/modules/cc/">Creative Commons</ulink>
              </entry>
              <entry>Proposé</entry>
              <entry>associer un copyright de type Creative commons</entry>
            </row>
            <row>
              <entry>
                <ulink url="http://www.usemod.com/cgi-bin/mb.pl?ModWiki">Wiki</ulink>
              </entry>
              <entry>Proposé</entry>
              <entry>définir des méta-données propres aux wikis</entry>
            </row>
          </tbody>
        </tgroup>
      </table>
    </section>
    <section>
      <title>Le module Dublin Core</title>
      <para>Prenons tout d'abord l'exemple du module Dublin Core qui est sans
      doute un des plus utiles et des plus utilisés. (Pour en savoir plus sur
      le Dublin Core, vous pouvez consulter l'article 
      <ulink url="/articles/dublin_core/">Métadonnées et Dublin
      Core</ulink>.)</para>
      <para>Déclarons tout d'abord le module Dublin Core dans les espaces de
      noms <acronym>XML</acronym> :</para>
      <programlisting><![CDATA[<rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://purl.org/rss/1.0/">]]></programlisting>
      <para>Nous pouvons à présent ajouter à notre fil :</para>
      <itemizedlist>
        <listitem>
          <para>un auteur : <sgmltag>dc:creator</sgmltag> ;</para>
        </listitem>
        <listitem>
          <para>une date : <sgmltag>dc:date</sgmltag> (au format 
          <ulink url="http://www.w3.org/TR/NOTE-datetime"><acronym>W3CDTF</acronym></ulink>) ;</para>
        </listitem>
        <listitem>
          <para>une langue : <sgmltag>dc:language</sgmltag> ;</para>
        </listitem>
        <listitem>
          <para>des rubriques ou catégories : <sgmltag>dc:subject</sgmltag> ;</para>
        </listitem>
        <listitem>
          <para>ou toute autre méta-donnée disponible dans le Dublin
          Core.</para>
        </listitem>
      </itemizedlist>
      <para>Reprenons l'exemple de notre fil OpenWeb, tout d'abord pour le
      canal :</para>
      <programlisting><![CDATA[<channel rdf:about="http://www.openweb.eu.org/">
<title>Openweb.eu.org</title>
<link>http://www.openweb.eu.org/</link>
<description>Description du site OpenWeb</description>
<dc:language>fr</dc:language>
etc.]]></programlisting>
      <para>Puis pour un élément :</para>
      <programlisting><![CDATA[<item rdf:about="http://openweb.eu.org/articles/png_vs_gif/">
<title>Le PNG face au GIF</title>
<link>http://openweb.eu.org/articles/png_vs_gif/</link>
<description>Qui est donc ce remplaçant du GIF, datant de 1996 et
méconnu de la plupart des graphistes, amateurs comme
professionnels ?</description>
<dc:creator>Fabrice Bonny</dc:creator>
<dc:date>2004-03-21</dc:date>
<dc:subject>Débutant,Expert,PNG,Multimédia</dc:subject>
</item>]]></programlisting>
      <para>Voir <ulink url="annexes/exemple_RSS1_DC.xml">l'exemple complet
      avec l'ajout des éléments Dublin Core</ulink>.</para>
    </section>
    <section>
      <title>Module Content</title>
      <para>Un choix inévitable au moment de former un fil 
      <acronym>RSS</acronym> est de décider si l'on délivre le contenu complet
      du site (les articles entiers) ou si l'on ne fait qu'avertir le lecteur
      de sa mise en ligne (en lui fournissant une description, un résumé, le
      début des articles&#8230;) :</para>
      <itemizedlist>
        <listitem>
          <para>dans le cadre de notre exemple (un fil signalant l'actualité du
          site OpenWeb), il est inutile de syndiquer intégralement les articles
          puisqu'il s'agit d'inviter les utilisateurs à consulter le site
          original ;</para>
        </listitem>
        <listitem>
          <para>à l'inverse, la reproduction intégrale du contenu est
          nécessaire lorsqu'on souhaite permettre sa publication sur d'autres
          sites.</para>
        </listitem>
      </itemizedlist>
      <para>Dans ce dernier cas en particulier, il est intéressant d'enrichir
      le contenu avec des balises <acronym>HTML</acronym> plutôt que de
      n'offrir qu'un texte brut. C'est le rôle du module
      <emphasis>content</emphasis>.</para>
      <para>Ajoutons tout d'abord ce module comme nous l'avons vu précédemment
      pour le Dublin Core :</para>
      <programlisting><![CDATA[<rdf:RDF xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://purl.org/rss/1.0/">]]></programlisting>
      <para>Puis, au niveau des <sgmltag>item</sgmltag> :</para>
      <programlisting><![CDATA[<item rdf:about="http://example.com/foo">
<title>My title</title>
<link>http://example.com/foo</link>
<description>Lorem ipsum</description>
<content:encoded>]]>
&lt;![CDATA[<![CDATA[<p>Mon contenu peut désormais
être en <abbr>html</abbr>.</p>]]>]]&gt;<![CDATA[</content:encoded>
</item>]]></programlisting>
      <para>On notera ici l'utilisation de la section <acronym>XML</acronym>
      <token>CDATA</token> dont le contenu ne sera pas interprété comme du code
      source <acronym>XML</acronym> par les analyseurs syntaxiques. Ceci permet
      aux balises <acronym>HTML</acronym> d'être considérées comme du texte
      brut et d'éviter ainsi les conflits avec les balises 
      <acronym>XML</acronym>. Une autre manière de faire aurait été d'échapper
      le balisage <acronym>HTML</acronym>, en transformant :</para>
      <itemizedlist>
        <listitem>
          <para><token>&lt;</token> en <token>&amp;lt;</token> ;</para>
        </listitem>
        <listitem>
          <para><token>&gt;</token> en <token>&amp;gt;</token> ;</para>
        </listitem>
        <listitem>
          <para><token>&amp;</token> en <token>&amp;amp;</token> ;</para>
        </listitem>
        <listitem>
          <para><token>'</token> en <token>&amp;apos;</token> ;</para>
        </listitem>
        <listitem>
          <para><token>"</token> en <token>&amp;quot;</token>.</para>
        </listitem>
      </itemizedlist>
      <para>Notre exemple serait alors :</para>
      <programlisting><![CDATA[<content:encoded>
&lt;p&gt; Mon contenu peut désormais
être en &lt;abbr&gt;html&lt;/abbr&gt;. &lt;/p&gt;
</content:encoded>]]></programlisting>
    </section>
  </section>
  <section>
    <title>Associer une image au fil RSS</title>
    <para>Une bonne pratique existante consiste à associer une image (logo) au
    fil <acronym>RSS</acronym>. Cette image pourra apparaître dans les logiciels
    d'aggrégation ou sur les sites reprenant vos titres. Tout d'abord, il faut
    déclarer l'image dans la section <sgmltag>channel</sgmltag> du fil 
    <acronym>RSS</acronym> avec son <acronym>URI</acronym> :</para>
    <programlisting><![CDATA[<channel rdf:about="http://www.openweb.eu.org/">
<title>Openweb.eu.org</title>
<link>http://www.openweb.eu.org/</link>
<description>Description du site OpenWeb</description>
<dc:language>fr</dc:language>
<image rdf:resource="http://openweb.eu.org/img/logo.png"/>
<items>
<rdf:Seq> [...] </rdf:Seq>
</items>
</channel>]]></programlisting>
    <para>Ensuite, il suffit d'insérer l'élément <sgmltag>image</sgmltag> au
    même niveau que les <sgmltag>item</sgmltag>. Cet élément
    <sgmltag>image</sgmltag> comporte 3 sous-éléments obligatoires ainsi
    définis :</para>
    <itemizedlist>
      <listitem>
        <para><sgmltag>title</sgmltag> : le texte alternatif (attribut
        <sgmltag class="attribute">alt</sgmltag>) associé à la balise image
        du canal lorsqu'il est rendu en <acronym>HTML</acronym> ;</para>
      </listitem>
      <listitem>
        <para><sgmltag>url</sgmltag> : l'<acronym>URL</acronym> de l'image
        à utiliser dans l'attribut <sgmltag class="attribute">src</sgmltag> de
        la balise image du canal rendu en <acronym>HTML</acronym> ;</para>
      </listitem>
      <listitem>
        <para><sgmltag>link</sgmltag> : l'<acronym>URL</acronym> à laquelle
        sera liée l'image du rendu <acronym>HTML</acronym> du canal. Comme le
        lien du titre du canal, il s'agit communément de la page d'accueil du
        site parent ou de la page d'actualité.</para>
      </listitem>
    </itemizedlist>
    <para>Ce qui donne :</para>
    <programlisting><![CDATA[<image rdf:about="http://openweb.eu.org/img/logo.png">
<title>OpenWeb, pour les standards du web</title>
<url>http://openweb.eu.org/img/logo.png</url>
<link>http://openweb.eu.org/</link>
</image>]]></programlisting>
    <para>Voir notre <ulink url="annexes/exemple-rss-image.xml">exemple de fil 
    <acronym>RSS</acronym> avec image</ulink>.</para>
  </section>
  <section>
    <title>Conclusion</title>
    <para>Bien que sa syntaxe paraisse un peu complexe, <acronym>RSS</acronym>
    1.0 est une bonne introduction au monde du Web sémantique et des
    technologies <acronym>RDF</acronym> car il en donne une application pratique
    et grand public, tout comme son cousin <acronym>FOAF</acronym>.</para>
  </section>
  <section>
    <title>Liens</title>
    <itemizedlist>
      <listitem>
        <para><ulink url="http://web.resource.org/rss/1.0/">Page d'accueil 
        <acronym>RSS</acronym> 1.0</ulink>.</para>
      </listitem>
      <listitem>
        <para><ulink url="http://web.resource.org/rss/1.0/spec">Spécification 
        <acronym>RSS</acronym> 1.0 en anglais</ulink>.</para>
      </listitem>
      <listitem>
        <para><ulink url="http://web.resource.org/rss/1.0/modules/dc/">Module 
        <acronym>DC</acronym> pour <acronym>RSS</acronym></ulink>.</para>
      </listitem>
      <listitem>
        <para><ulink url="http://dublincore.org/documents/2003/02/04/dces/">
        <acronym>DC</acronym> Reference Description</ulink>.</para>
      </listitem>
    </itemizedlist>
  </section>
</article>
