<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
  <head>
    <title>Openweb.eu.org - Construction d'un fil RSS 1.0</title>
    <meta http-equiv="Content-type" content="text/html; charset=UTF-8" />
    <link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" />
    <meta name="DC.Language" scheme="RFC3066" content="fr" />
    <meta name="DC.Identifier" content="rss_construction10" />
    <meta name="DC.Creator" content="François Hodierne" />
    <meta name="DC.Rights" content="Cet article est sous licence Creative Commons Attribution-ShareAlike." />
    <meta name="DC.Date.created" scheme="W3CDTF" content="2004-10-14" />
    <meta name="DC.Date.modified" scheme="W3CDTF" content="2004-10-14" />
    <meta name="DC.Subject" content="expert, debutant, rss" />
  </head>
  <body>
    <h1>Construction d'un fil RSS 1.0</h1>
    <ul>
      <li>
        <strong>Profil :</strong> <a href="/expert/">Expert</a>, <a href="/debutant/">Débutant</a>
      </li>
      <li>
        <strong>Technologie :</strong> <a href="/rss/">RSS</a>
      </li>
      <li>
        <strong>Auteur :</strong> François Hodierne</li>
      <li>
        <strong>Mise à jour :</strong> 14/10/2004</li>
    </ul>
    <h2>En bref</h2>
    <p>Pas à pas, comment construire un fil <acronym title="RDF Site Summary" lang="en">RSS</acronym> au format RDF Site Summary 1.0.</p>
    <hr />
    <p>Cet article fait suite à
  l'<a href="/articles/rss_introduction/">Introduction à RSS</a> et
  reprend en particulier son exemple de fil <acronym>RSS</acronym>
  des publications d'OpenWeb.</p>
    <p>La <a href="http://web.resource.org/rss/1.0/spec">spécification 
  <acronym>RSS</acronym> 1.0</a>, 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 <q>un format de syndication et de
  description de métadonnées léger, universel et extensible</q>.
  Il se base intégralement sur la spécification <acronym title="Resource Description Framework" lang="en">RDF</acronym> du 
  <acronym title="World Wide Web Consortium" lang="en">W3C</acronym>, en adoptant une structure modulaire basée sur les
  espaces de noms <acronym title="eXtensible Markup Language" lang="en">XML</acronym>.</p>
    <h3>Changements par rapport à <acronym>RSS</acronym> 0.91</h3>
    <ul>
      <li>La déclaration de <acronym title="Document Type Definition" lang="en">DTD</acronym> disparaît.</li>
      <li>
        <p>La racine <acronym>XML</acronym> devient :</p>
        <pre>&lt;rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://purl.org/rss/1.0/"&gt;</pre>
        <p>Il faut donc désormais clore le fil par 
        <code>&lt;/rdf:RDF&gt;</code> et non plus par 
        <code>&lt;/rss&gt;</code>.</p>
      </li>
      <li>
        <p>La balise <code>channel</code> se voit ajouter un
	attribut obligatoire <code>"rdf:about"</code>
	qui aura comme valeur l'<acronym title="Universal Resource Identifier" lang="en">URI</acronym> du feed. Le plus
	souvent, on prendra l'<acronym title="Uniform Resource Locator" lang="en">URL</acronym> du site ou
	l'<acronym>URL</acronym> du fichier <acronym>RSS</acronym> :</p>
        <pre>&lt;channel rdf:about="http://www.openweb.eu.org"&gt;</pre>
        <p>La balise <code>item</code> se voit aussi ajouter cet
	attribut obligatoire <code>"rdf:about"</code>
	qui aura comme valeur l'<acronym>URI</acronym> de l'élément,
	c'est-à-dire, là encore, le plus souvent son
	<acronym>URL</acronym> :</p>
        <pre>&lt;item rdf:about="http://openweb.eu.org/articles/png_vs_gif/"&gt;
&lt;title&gt;Le PNG face au GIF&lt;/title&gt;
&lt;link&gt;http://openweb.eu.org/articles/png_vs_gif/&lt;/link&gt;
&lt;description&gt;Qui est donc ce remplaçant du GIF, datant de 1996 et
méconnu de la plupart des graphistes, amateurs comme
professionnels&amp;#160;?&lt;/description&gt;
&lt;/item&gt;</pre>
        <p>Comme la valeur de ce paramètre
	<code>"rdf:about"</code> 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.</p>
      </li>
      <li>La balise <code>language</code> disparaît.</li>
      <li>
        <p>Le changement le plus marquant est sans doute la présence
        obligatoire d'une <em>table des matières</em> 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 :</p>
        <pre>&lt;items&gt;
&lt;rdf:Seq&gt;
&lt;rdf:li rdf:resource="http://openweb.eu.org/articles/png_vs_gif/"/&gt;
&lt;rdf:li rdf:resource="http://openweb.eu.org/articles/initiation_css/"/&gt;
&lt;rdf:li rdf:resource="http://openweb.eu.org/articles/interview_ned_baldessin/"/&gt;
&lt;/rdf:Seq&gt;
&lt;/items&gt;</pre>
        <p>Les valeurs <code>"rdf:ressource"</code>
	doivent correspondre aux valeurs
	<code>"rdf:about"</code> des
	<code>item</code> correspondants.</p>
      </li>
      <li>La clôture de l'élément <code>channel</code> est déplacée.
	On le ferme désormais avant le premier <code>item</code> et non
	plus après le dernier <code>item</code>.</li>
    </ul>
    <p>Le <a href="annexes/exemple_RSS_091.xml">document 
    <acronym>RSS</acronym> 0.91</a> que nous avions créé précédemment
    devient ainsi <a href="annexes/exemple_RSS_1.xml">un premier exemple
    de feed <acronym>RSS</acronym> 1.0 minimal</a> (le fichier est
    commenté).</p>
    <h3>Les modules</h3>
    <h4>Un mécanisme d'extensivité</h4>
    <p>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
      (<code>title</code>, <code>link</code> et
      <code>description</code>). Pour aller plus loin et enrichir
      les (méta)données, ils ont decidé que tout se passerait via des 
      <em>modules</em> qui permettent à <acronym>RSS</acronym>
      d'être étendu :</p>
    <blockquote>
      <ul>
        <li>sans nécessiter des réécritures itératives de la
            spécification du noyau ;</li>
        <li>sans qu'un consensus soit nécessaire pour chaque
            élément ;</li>
        <li>sans alourdir <acronym>RSS</acronym> avec des éléments qui,
            en majorité, resteraient inutilisés dans la plupart des domaines
            et des applications.</li>
      </ul>
    </blockquote>
    <p>Cette modularisation est accomplie en utilisant les 
      <em>espaces de noms <acronym>XML</acronym>
      </em>. 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 :</p>
    <table width="100%" border="1" rules="all">
      <caption>Modules</caption>
      <thead>
        <tr>
          <th>Nom</th>
          <th>Statut</th>
          <th>Usage</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td>
            <a href="http://web.resource.org/rss/1.0/modules/dc/">Dublin
                Core</a>
          </td>
          <td>Officiel</td>
          <td>définir des méta-données comme des dates, des auteurs, des
              mots-clefs…</td>
        </tr>
        <tr>
          <td>
            <a href="http://web.resource.org/rss/1.0/modules/syndication/">Syndication</a>
          </td>
          <td>Officiel</td>
          <td>donner des indications sur la fréquence de mise à
              jour</td>
        </tr>
        <tr>
          <td>
            <a href="http://web.resource.org/rss/1.0/modules/content/">Content</a>
          </td>
          <td>Officiel</td>
          <td>associer le contenu complet d'un article</td>
        </tr>
        <tr>
          <td>
            <a href="http://web.resource.org/rss/1.0/modules/admin/">Admin</a>
          </td>
          <td>Proposé</td>
          <td>donne des indications sur le générateur du fil 
              <acronym>RSS</acronym>
          </td>
        </tr>
        <tr>
          <td>
            <a href="http://web.resource.org/rss/1.0/modules/cc/">Creative Commons</a>
          </td>
          <td>Proposé</td>
          <td>associer un copyright de type Creative commons</td>
        </tr>
        <tr>
          <td>
            <a href="http://www.usemod.com/cgi-bin/mb.pl?ModWiki">Wiki</a>
          </td>
          <td>Proposé</td>
          <td>définir des méta-données propres aux wikis</td>
        </tr>
      </tbody>
    </table>
    <h4>Le module Dublin Core</h4>
    <p>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 
      <a href="/articles/dublin_core/">Métadonnées et Dublin
      Core</a>.)</p>
    <p>Déclarons tout d'abord le module Dublin Core dans les espaces de
      noms <acronym>XML</acronym> :</p>
    <pre>&lt;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/"&gt;</pre>
    <p>Nous pouvons à présent ajouter à notre fil :</p>
    <ul>
      <li>un auteur : <code>dc:creator</code> ;</li>
      <li>une date : <code>dc:date</code> (au format 
          <a href="http://www.w3.org/TR/NOTE-datetime">
          <acronym>W3CDTF</acronym>
        </a>) ;</li>
      <li>une langue : <code>dc:language</code> ;</li>
      <li>des rubriques ou catégories : <code>dc:subject</code> ;</li>
      <li>ou toute autre méta-donnée disponible dans le Dublin
          Core.</li>
    </ul>
    <p>Reprenons l'exemple de notre fil OpenWeb, tout d'abord pour le
      canal :</p>
    <pre>&lt;channel rdf:about="http://www.openweb.eu.org/"&gt;
&lt;title&gt;Openweb.eu.org&lt;/title&gt;
&lt;link&gt;http://www.openweb.eu.org/&lt;/link&gt;
&lt;description&gt;Description du site OpenWeb&lt;/description&gt;
&lt;dc:language&gt;fr&lt;/dc:language&gt;
etc.</pre>
    <p>Puis pour un élément :</p>
    <pre>&lt;item rdf:about="http://openweb.eu.org/articles/png_vs_gif/"&gt;
&lt;title&gt;Le PNG face au GIF&lt;/title&gt;
&lt;link&gt;http://openweb.eu.org/articles/png_vs_gif/&lt;/link&gt;
&lt;description&gt;Qui est donc ce remplaçant du GIF, datant de 1996 et
méconnu de la plupart des graphistes, amateurs comme
professionnels ?&lt;/description&gt;
&lt;dc:creator&gt;Fabrice Bonny&lt;/dc:creator&gt;
&lt;dc:date&gt;2004-03-21&lt;/dc:date&gt;
&lt;dc:subject&gt;Débutant,Expert,PNG,Multimédia&lt;/dc:subject&gt;
&lt;/item&gt;</pre>
    <p>Voir <a href="annexes/exemple_RSS1_DC.xml">l'exemple complet
      avec l'ajout des éléments Dublin Core</a>.</p>
    <h4>Module Content</h4>
    <p>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…) :</p>
    <ul>
      <li>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 ;</li>
      <li>à l'inverse, la reproduction intégrale du contenu est
          nécessaire lorsqu'on souhaite permettre sa publication sur d'autres
          sites.</li>
    </ul>
    <p>Dans ce dernier cas en particulier, il est intéressant d'enrichir
      le contenu avec des balises <acronym title="HyperText Markup Language" lang="en">HTML</acronym> plutôt que de
      n'offrir qu'un texte brut. C'est le rôle du module
      <em>content</em>.</p>
    <p>Ajoutons tout d'abord ce module comme nous l'avons vu précédemment
      pour le Dublin Core :</p>
    <pre>&lt;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/"&gt;</pre>
    <p>Puis, au niveau des <code>item</code> :</p>
    <pre>&lt;item rdf:about="http://example.com/foo"&gt;
&lt;title&gt;My title&lt;/title&gt;
&lt;link&gt;http://example.com/foo&lt;/link&gt;
&lt;description&gt;Lorem ipsum&lt;/description&gt;
&lt;content:encoded&gt;
&lt;![CDATA[&lt;p&gt;Mon contenu peut désormais
être en &lt;abbr&gt;html&lt;/abbr&gt;.&lt;/p&gt;]]&gt;&lt;/content:encoded&gt;
&lt;/item&gt;</pre>
    <p>On notera ici l'utilisation de la section <acronym>XML</acronym>
      <code>CDATA</code> 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 :</p>
    <ul>
      <li>
        <code>&lt;</code> en <code>&amp;lt;</code> ;</li>
      <li>
        <code>&gt;</code> en <code>&amp;gt;</code> ;</li>
      <li>
        <code>&amp;</code> en <code>&amp;amp;</code> ;</li>
      <li>
        <code>'</code> en <code>&amp;apos;</code> ;</li>
      <li>
        <code>"</code> en <code>&amp;quot;</code>.</li>
    </ul>
    <p>Notre exemple serait alors :</p>
    <pre>&lt;content:encoded&gt;
&amp;lt;p&amp;gt; Mon contenu peut désormais
être en &amp;lt;abbr&amp;gt;html&amp;lt;/abbr&amp;gt;. &amp;lt;/p&amp;gt;
&lt;/content:encoded&gt;</pre>
    <h3>Associer une image au fil RSS</h3>
    <p>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 <code>channel</code> du fil 
    <acronym>RSS</acronym> avec son <acronym>URI</acronym> :</p>
    <pre>&lt;channel rdf:about="http://www.openweb.eu.org/"&gt;
&lt;title&gt;Openweb.eu.org&lt;/title&gt;
&lt;link&gt;http://www.openweb.eu.org/&lt;/link&gt;
&lt;description&gt;Description du site OpenWeb&lt;/description&gt;
&lt;dc:language&gt;fr&lt;/dc:language&gt;
&lt;image rdf:resource="http://openweb.eu.org/img/logo.png"/&gt;
&lt;items&gt;
&lt;rdf:Seq&gt; [...] &lt;/rdf:Seq&gt;
&lt;/items&gt;
&lt;/channel&gt;</pre>
    <p>Ensuite, il suffit d'insérer l'élément <code>image</code> au
    même niveau que les <code>item</code>. Cet élément
    <code>image</code> comporte 3 sous-éléments obligatoires ainsi
    définis :</p>
    <ul>
      <li>
        <code>title</code> : le texte alternatif (attribut
        <code>"alt"</code>) associé à la balise image
        du canal lorsqu'il est rendu en <acronym>HTML</acronym> ;</li>
      <li>
        <code>url</code> : l'<acronym>URL</acronym> de l'image
        à utiliser dans l'attribut <code>"src"</code> de
        la balise image du canal rendu en <acronym>HTML</acronym> ;</li>
      <li>
        <code>link</code> : 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é.</li>
    </ul>
    <p>Ce qui donne :</p>
    <pre>&lt;image rdf:about="http://openweb.eu.org/img/logo.png"&gt;
&lt;title&gt;OpenWeb, pour les standards du web&lt;/title&gt;
&lt;url&gt;http://openweb.eu.org/img/logo.png&lt;/url&gt;
&lt;link&gt;http://openweb.eu.org/&lt;/link&gt;
&lt;/image&gt;</pre>
    <p>Voir notre <a href="annexes/exemple-rss-image.xml">exemple de fil 
    <acronym>RSS</acronym> avec image</a>.</p>
    <h3>Conclusion</h3>
    <p>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>.</p>
    <h3>Liens</h3>
    <ul>
      <li>
        <a href="http://web.resource.org/rss/1.0/">Page d'accueil 
        <acronym>RSS</acronym> 1.0</a>.</li>
      <li>
        <a href="http://web.resource.org/rss/1.0/spec">Spécification 
        <acronym>RSS</acronym> 1.0 en anglais</a>.</li>
      <li>
        <a href="http://web.resource.org/rss/1.0/modules/dc/">Module 
        <acronym>DC</acronym> pour <acronym>RSS</acronym>
        </a>.</li>
      <li>
        <a href="http://dublincore.org/documents/2003/02/04/dces/">
          <acronym>DC</acronym> Reference Description</a>.</li>
    </ul>
  </body>
</html>
