Content als "Bürger erster Klasse"

(Auszug aus "Newsfeeds mit RSS und Atom" von Heinz Wittenbrink, erschienen bei Galileo Press, 2005)

Text in Atom-Elementen – HTML, XHTML oder reiner Text

In dem Beispiel kommen zwei Elemente mit textuellem Inhalt vor – title und summary. Den Inhalt dieser Elemente bilden reine Textdaten. Bei allen Elementen mit textuellem Inhalt bietet Atom auch die Möglichkeiten, HTML oder XHTML zu verwenden.

Die Atom-Spezifikation spricht von "Textkonstrukten" als Inhalt der Elemente title und summary. (Auch das Element content kann ein Textkonstrukt aufnehmen, siehe Abschnitt Das Element atom:content – Ein Container für Inhalte.) Bei allen Elementen, die Textkonstrukte aufnehmen können, lässt sich mit dem Attribut type angeben, welche Art von Text in ihnen verwendet wird. Nur drei Werte sind für type erlaubt, text, html und xhtml:

  1. Wenn der Wert text ist, wird der Inhalt des Elements von gewöhnlichem Text gebildet, der keinerlei Markup enthält.
  2. Wenn der Wert html ist, besteht der Inhalt aus Text mit maskiertem ("escapetem") HTML-Markup. Ein als HTML-Element em ausgezeichneter Abschnitt würde also z. B. so wiedergegeben: <em> ... </em>. Auch in diesem Fall wird der Inhalt nur von Text, nicht von Markup gebildet. (Im XML-Infoset kommt in diesem Fall nur der Unicode-Character vor.) Ein Client kann das geschützte Markup aber zur Darstellung des entsprechenden Passus verwenden. Eine zusätzliche Bedingung besagt, dass der Inhalt des Elements in einem validen HTML-Dokument den Inhalt eines Elements des Typs div bilden können muss. Es ist also nicht erlaubt, willkürlich Fragmente eines HTML-Dokuments in einem Textkonstrukt unterzubringen. Auf diese Weise wird sichergestellt, dass die Software, die das Fragment darstellt, es nach für HTML geltenden Regeln verarbeiten kann.
  3. Die dritte Alternative besteht darin, xhtml als Wert des Attributs type anzugeben und als Inhalt des Textkonstrukts zu gebrauchen, das mit XHTML-Markup ausgezeichnet ist. In diesem Fall sind die XHTML-Elemente im Dokumentbaum des Atom-Elements Nachkommen des Elements, welches das Textkonstrukt aufnimmt. Hier gilt nicht nur die Einschränkung, dass das HTML-Fragment auch Inhalt eines div-Elements in einem gültigen XHTML-Dokument sein können muss. Das XHTML-Fragment muss tatsächlich in ein XHTML-div eingebettet sein. Wie im Fall von HTML als Inhalt kann Client-Software das XHTML-Markup interpretieren, um das Fragment darzustellen. Anders als bei HTML als Inhalt darf in diesem Fall aber geschütztes Markup innerhalb des Fragments nicht durch gültiges Markup ersetzt werden. Dadurch ist es möglich, Markup in einem entsprechenden Fragment zu zitieren.

Wenn kein Wert angegeben ist, wird der Inhalt als Text interpretiert. Das bedeutet: Wenn der Inhalt eines dieser Elemente als HTML oder XML verarbeitet werden soll, muss das Attribut type mit einem entsprechenden Wert verwendet werden.

Mit diesen Alternativen wird das Format der üblichen Praxis gerecht, HTML-Fragmente als Inhalt von RSS-Elementen zu verwenden. Da das Attribut type eindeutig angibt, welches Format für den Inhalt gebraucht wird, kann das Element entsprechend verarbeitet werden, ohne gegen die Regeln von XML zu verstoßen. Sam Ruby hat immer wieder darauf hingewiesen, dass bei der üblichen Verfahrensweise, so genanntes "Entity-kodiertes" HTML als Inhalt von RSS-Elmenten zu verwenden, nicht klar ist, wie HTML im Inhalt eines RSS-Dokuments überhaupt entdeckt werden kann. Ben Trott weist in Why We Need Echo darauf hin, dass die Repräsentation des Inhalts der wichtigste Teil eines Feeds ist. Es sei nicht klar, ob man dazu doppelt kodierte Entities, ein content:encoded-Element mit einem CDATA-Abschnitt oder das Element xhtml:body verwenden solle. Ein weiteres Problem des sogenannten Entity-kodierten HTML ist, dass nicht klar ist, wie mit relativen URIs umgegangen werden soll, die sich darin häufig finden. Atom verwendet xml:base, damit eindeutig ist, wie relative URIs zu interpretieren sind. (Siehe zu dieser Problematik bei RSS 2.0 und seinen Vorgängern auch die Seite Text oder HTML als Inhalt von title und description).

Das folgende Code-Beispiel zeigt, wie Textkonstrukte der Typen text und html verwendet werden. In dem Element summary des ersten Eintrags wurde lediglich das Attribut type hinzugefügt. Es wird genauso verarbeitet wie das Beispiel auf der Seite Grundstruktur eines Atom-Dokuments, denn die verarbeitende Software muss ja davon ausgehen, dass es sich beim Inhalt des Elements um Text handelt, wenn nichts anderes angegeben ist. Der Inhalt des zweiten summary-Elements könnte von einem Newsreader wie ein HTML-Element des Typs P mit einem eingestreuten Zitat (Elementtyp Q) dargestellt werden.

...
<entry>
   <title>Ask Jeeves jetzt auch in Spanien</title>
   <summary type="text">Ask Jeeves startete am 5. April mit der Betaversion eines neuen Such-Service...</summary>
   <updated>2005–04–15T08:15:48.428Z</updated>
   <id>http://www.celawi.com/webtrends/20040415_01.html</id>
</entry>
<entry>
   <title>Bitkom-Studie: Paid Content in Deutschland erfolgreich</title>
   <summary type="html">&lt;P&gt;Kostenpflichtige Online-Inhalte werden immer besser angenommen: &lt;Q&gt;Die Zeit der Kostenlos-Kultur geht zu Ende, gleichzeitig steigt die Qualität der Angebote&lt;/Q&gt;, sagt Bernhard Rohleder, Hauptgeschäftsführer von Bitkom. Um 137 Prozent - auf 484 Millionen Euro - werde das Absatzvolumen in diesem Jahr zunehmen. 2004 konnte ein Plus von 105 Prozent verzeichnet werden.</summary>
   <updated>2005–04–15T08:15:48.428Z</updated>
   <id>http://www.celawi.com/webtrends/20040415_02.html</id>
</entry>
... 

Code-Beispiel: Beispiel für Textkonstrukte der Typen text und html

Im folgenden Beispiel wird für den Inhalt des zweiten Elements summary XHTML verwendet. Achten Sie darauf, dass der Namensraum wie vorgeschrieben angegeben ist und der XHTML-Inhalt in ein XHTML-Element des Typs div eingebettet wird!

...
<entry>
   <title>Bitkom-Studie: Paid Content in Deutschland erfolgreich</title>
   <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
         <p>Kostenpflichtige Online-Inhalte werden immer besser angenommen: <q>Die Zeit der Kostenlos-Kultur geht zu Ende, gleichzeitig steigt die Qualität der Angebote</q>, sagt Bernhard Rohleder, Hauptgeschäftsführer von Bitkom. Um 137 Prozent - auf 484 Millionen Euro - werde das Absatzvolumen in diesem Jahr zunehmen. 2004 konnte ein Plus von 105 Prozent verzeichnet werden.</p>
      </div>
   </summary>
   <updated>2005–04–15T08:15:48.428Z</updated>
   <id>http://www.celawi.com/webtrends/20040415_02.html</id>
</entry> 

Code-Beispiel: Beispiel für ein Textkonstrukt des Typs 'xhtml'

Nur eindeutig als XHTML gekennzeichneter Inhalt darf auch als XHTML geparst werden. Das ermöglicht u. a., möglicherweise gefährliche Elemente, etwa JavaScript, herauszufiltern.

Innerhalb von XHTML-Fragmenten ist es unproblematisch, Markup zu zitieren. Möglich ist also z. B. folgende Konstruktion:

<atom:title type="xhtml">
   <xhtml:div xmlns:xhtml="http://www.w3.org/1999/xhtml">Das Element &lt;br/&gt;: meist überflüssig!</xhtml:div>
</atom:title> 

Code-Beispiel: Zitiertes Markup in einem XHTML-Fragment innerhalb eines Atom-Elements

Ein Aggregator, der den Inhalt des Elements als Fragment eines validen XHTML-Elements interpretiert, kann es korrekt wie folgt darstellen:

Das Element <br/>: meist überflüssig!

Wenn der Typ des Textkonstrukts dagegen HTML ist, ist es der verarbeitenden Software überlassen, wie sie geschütztes Markup für die Darstellung als HTML-Markup verwendet. Die meisten RSS-Aggregatoren und Newsreader dürften maskierte Markup-Begrenzer für die Darstellung als Begrenzer von HTML-Markup interpretieren. Das Fragment

<atom:title type="html">Das Element &lt;br&gt;: meist überflüssig!</atom:title> 

würde so wiedergegeben:

Das Element
: meist überflüssig!

Wenn die verarbeitende Software maskiertes Markup nur einmal umwandelt, gibt es die Möglichkeit des doppelten Escapens, um Markup zu zitieren. Ein Beispiel zeigt das folgende Fragment:

<atom:title type="html">Das Element &amp;lt;br&amp;gt;: meist überflüssig!</atom:title> 

Code-Beispiel: Doppelt maskiertes Markup in einem HTML-Fragment

Das Element atom:content – ein Container für Inhalte

Inhalt soll bei Atom die Rechte eines "first class citizen" haben. Aus diesem Grund ist content ein Container für jede Art von Inhalt, über die Textkonstrukte hinaus, die auch Inhalt von title, subtitle und summary sein können.

content ist das wichtigste Element vieler Feeds. Durch dieses Element wird Atom zu einem Transportformat für unterschiedliche Inhalte. Zugleich ist es wohl das Atom-Element mit dem komplexesten Inhaltsmodell. Der Inhalt

  • kann sich innerhalb des Dokuments (inline) oder außerhalb (out-of-line) befinden,
  • kann textuell oder binär sein,
  • kann zusätzlich in dem Element summary beschrieben werden oder nicht.

Entscheidet man sich für eine dieser Möglichkeiten, ist man bei den anderen in der Wahl nicht immer frei. Out-of-line-Inhalte müssen z. B. in einer summary beschrieben werden.

Eingebetteter oder verlinkter Inhalt

Grundsätzlich bieten sich dem Autor eines Feeds zwei Alternativen, um einen Inhalt für ein entry festzulegen:

  1. Er kann den Inhalt direkt zwischen das Start- und das Endtag von content setzen; die Atom-Spezifikation spricht in diesem Fall von inline-Inhalt. Immer wenn es sich bei dem Inhalt nicht um einfachen Text handelt, muss mit dem Attribut type angegeben werden, um welchen Typ von Inhalt es sich handelt.
  2. Er kann einen URI angeben, über den sich der Inhalt beziehen lässt. Der URI bildet den Wert des optionalen Attributs src. In diesem Fall muss der MIME-Medientyp des Inhalts als Wert von type angegeben werden. In der Spezifikation wird diese Art von Inhalt als out-of-line bezeichnet.

Diese beiden Möglichkeiten schließen sich gegenseitig aus. Das Attribut src darf nur verwendet werden, wenn content ein leeres Element ist! Beide Möglichkeiten stehen sowohl für textuelle wie für binäre Inhalte zur Verfügung. Wie Sie in den folgenden Abschnitten sehen werden, bestehen dabei aber wichtige Einschränkungen.

atom:content und atom:summary

Das Element description hat in den verschiedenen RSS-Standards die Aufgabe, eine Zusammenfassung oder Synopse des Inhalts eines item aufzunehmen. Tatsächlich wird darin allerdings oft der komplette Inhalt untergebracht.

Diesen beiden Verwendungsweisen von description bei RSS entsprechen bei Atom zwei verschiedene Elemente: summary und content. Das Element summary (deutsch: Zusammenfassung) enthält einen Überblick und hat damit die Aufgabe, für die das Element description bei RSS ursprünglich vorgesehen war. content nimmt nicht Beschreibungen, sondern die Inhalte selbst auf oder enthält ein Link zu ihnen.

Entweder summary oder content müssen in einem entry-Element vorkommen. Wenn ein Eintrag keinen eigenen Inhalt hat, dann muss wenigstens ein Inhalt beschrieben werden. (In diesem Fall wird in der Regel in dem Element link angegeben, wo sich der Inhalt befindet.) Mehr als ein Element dieser Typen ist nicht erlaubt; es dürfen also nicht zwei oder mehr Inhalte in einem Eintrag vorhanden sein oder beschrieben werden. Beide Elementtypen können auch zusammen in einem Element entry vorhanden sein. Der Inhalt von summary beschreibt dann den Inhalt von content.

In zwei Fällen dürfen weder summary noch content fehlen:

  1. In einem Element entry muss immer dann auch ein Element summary enthalten sein, wenn das Element content mit dem Attribut src versehen und also leer ist. Ein Inhalt, der sich nicht innerhalb des Feeds selbst befindet, muss also wenigstens beschrieben werden.
  2. summary ist auch erforderlich, wenn der Inhalt von content Base64-kodiert ist. Das ist immer dann der Fall, wenn es sich um Inhalt in einem MIME-Medientyp handelt, der nicht mit text beginnt oder mit xml endet.

Diese beiden Forderungen ergeben sich aus dem Prinzip der Zugänglichkeit und Barrierefreiheit (accessibility). Wenn ein Inhalt aus irgendeinem Grund (Netzwerkprobleme, fehlende Wiedergabesoftware, Sicherheitsgesichtspunkte) nicht geladen werden kann oder soll, muss wenigstens eine Beschreibung angeboten werden. Umgekehrt kann ein Benutzer aufgrund der Beschreibung entscheiden, wie er mit dem Inhalt verfährt.

Textuelle Inhalte 1: einfacher Text, HTML und XHTML

Wie die Elemente title, subtitle und summary kann auch content ein Atom-Textkonstrukt enthalten, also einfachen Text (plain text), HTML oder XHTML. In diesem Fall wird genau wie bei diesen Elementen angegeben, von welchem Typ der Inhalt ist, der Wert ist text, html oder xhtml.

Im folgenden Code-Beispiel wird eine komplette Meldung in dem Element content untergebracht. summary enthält eine Zusammenfassung in einfachem Text.

...
<entry>
   <title>Bitkom-Studie: Paid Content in Deutschland erfolgreich </title>
   <summary type="text">Eine neue Studie des Branchenverbands Bitkom ergibt: Paid Content ist inzwischen auch in Deutschland wirtschaftlich erfolgreich.</summary>
   <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
         <h2>Studie: Kostenpflichtige Online-Inhalte in Deutschland erfolgreich</h2>
            <div class="meldung_wrapper">
               <p>Das Absatzvolumen von digitalen Inhalten über das Internet werde hierzulande in diesem Jahr um 137 Prozent auf 484 Millionen Euro zulegen. Das meint der Branchenverband <a href="http://www.bitkom.org" target="_blank">Bitkom</a>. Nach einem Plus von 105 Prozent im Jahr 2004 beschleunige sich das Wachstum damit auf sehr hohem Niveau. Bereits in zwei Jahren werde der Markt ein Volumen von deutlich mehr als einer Milliarde Euro erreichen, orakelt der Verband weiter. Bitkom bezieht sich hierbei auf eine aktuelle Studie des European Information Technology Observatory (EITO).</p>
            </div>
      </div>
   </content>
   <updated>2005–04–15T08:15:48.428Z</updated>
   <id>http://www.celawi.com/webtrends/20040415_02.html</id>
</entry>
... 

Code-Beispiel: XHTML als Inhalt von content

Textueller Inhalt II: andere Texttypen und XML

content kann im Gegenatz zu den übrigen Atom-Elementen, die Textkonstrukte aufnehmen können, auch Text in anderen Formaten enthalten. Voraussetzung ist aber, dass es sich um einen registrierten MIME-Medientyp handelt. In dem folgenden, stark gekürzten Code-Beispiel wird die Meldung aus dem letzten Beispiel im Rich Text Format übertragen.

<entry>
   <title>Bitkom-Studie: Paid Content in Deutschland erfolgreich</title>
   <summary type="text">Eine neue Studie des Branchenverbands Bitkom ergibt: Paid Content ist inzwischen auch in Deutschland wirtschaftlich erfolgreich.</summary>
   <content type="text/rtf">
   {\rtf1\mac\ansicpg10000\uc1\deff0\stshfdbch0\stshfloch0\stshfhich0\stshfbi0\deflang1031\deflangfe1031 {\upr{\fonttbl{\f0\fnil\fcharset256\fprq2{\*\panose 00020206030504050203}Times New Roman;}
   ...
   {\b\f178\fs48\insrsid873893\charrsid873893
   Studie: Kostenpflichtige Online-Inhalte in Deutschland erfolgreich
   \par
   \par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\f179\fs32\insrsid873893\charrsid873893 Das Absatzvolumen von digitalen Inhalten \u252\'9fber das Internet werde hierzulande in diesem Jahr um 137 Prozent auf 484 Millionen Euro zulegen ... des European Information Technology Observatory (EITO).}{\insrsid14698475
   \par }}
   </content>
   <updated>2005–04–15T08:15:48.428Z</updated>
   <id>http://www.celawi.com/webtrends/20040415_02.html</id>
</entry> 

Code-Beispiel: RTF-Text als Inhalt von content

In der Praxis dürfte die Möglichkeit, Dokumente oder Fragmente aus anderen XML-Vokabularen in das Element content einzubetten, interessanter sein.

Für XML-Inhalte bestehen zwei Möglichkeiten:

  1. Sie können direkt in das Element content eingebettet werden. In diesem Fall soll das Wurzel-Element des eingebetteten XML als Nachkomme von content verwendet werden. XML-Elemente sollten immer dann direkt in content eingeschlossen werden, wenn der Medientyp mit +xml endet (z. B. application/rdf+xml, image/svg+xml oder applicatiom/xhtml+ xml) oder mit text beginnt (z. B. text/xml). Die XML-Daten können dann beim Client an eine spezialisierte Anwendung weitergegeben werden, z. B. an einen SVG-Viewer oder einen HTML-Browser.
  2. Sie können über einen URI bezogen werden, der als Wert des Attributs src angegeben ist. Dieses Verfahren sollte nur verwendet werden, wenn der Medientyp auf /xml endet. (Zu den XML-Medientypen siehe RFC 3023 und XHTML Media Types. application/xml ist ein generischer Medientyp. Für registrierte Medientypen mit Endungen auf +xml, z. B. application/xhtml+xml, existieren in der Regel spezialisierte Anwendungen.) In diesem Fall können die Daten heruntergeladen werden, wenn die entprechende spezialisierte Software vorhanden ist.

Das folgende Code-Beispiel zeigt, wie eine SVG-Grafik in einen Atom-Eintrag eingebunden werden kann.

...
<entry>
   <title>Beispiel einer SVG-Grafik in einem Atom-Feed</title>
   <summary type="text">Die Grafik stellt eine Ellipse dar.</summary>
   <content type="image/xml+svg">
      <svg xmlns="http://www.w3.org/2000/svg" width="12cm" height="12cm" viewBox="0 0 1000 1000">
         <path d="M 270,300 A 180, 90 0 0 0 630 300  A 180, 90 0 0 0 270 300" stroke="red" fill="none"/>
      </svg>
   </content>
   <updated>2005–04–15T10:15:02.021Z</updated>
   <id>http://www.wittenbrink.net/streams/atom/07_02.html</id>
</entry>
... 

Code-Beispiel: XML-Inline-Inhalt in einem Atom-Feed

Dieses Verfahren eröffnet sehr viele Möglichkeiten, weil Atom damit zum Transport jeder Art von XML-Daten benutzt werden kann. Es wäre z. B. möglich, Suchergebnisse, die in einem OpenSearch-Fragment (siehe Das OpenSearch-Modul von Amazon) bezogen werden, gleich weiterzuverarbeiten.

Binäre Inhalte

Der Vollständigkeit halber zeigen die folgenden Code-Beispiele, wie binäre Inhalte inline und out-of-line in ein Atom-entry eingefügt werden. Das erste Beispiel verwendet ein spacer.gif. Da es sich um einen binären Inhalt handelt, muss er in dem Element summary beschrieben werden.

...
<entry>
   <title>Beispiel einer base64-kodierten GIF-Grafik in einem Atom-Feed</title>
   <summary type="text">Das Element content enthält eine transparente GIF-Datei von einem Pixel Größe.</summary>
   <content type="image/gif">R0lGODlhAQABAJH/AP///wAAAMDAwAAAACH5BAEAAAIALAAAAAABAAEAQAICVAEAOw==</content>
   <updated>2005–04–15T10:15:02.021Z</updated>
   <id>http://www.wittenbrink.net/streams/atom/07_03</id>
</entry>
... 

Code-Beispiel: Binärer Inline-Inhalt in einem Atom-entry

Im nächsten Code-Beispiel wird eine PDF-Datei out-of-line eingebunden: Auch in diesem Fall ist das Element summary zwingend vorgeschrieben.

...
<entry>
   <title>Fast ein Drittel der amerikanischen MP3-Player-Nutzer nutzt auch Podcasts</title>
   <summary type="text">2 Millionen US-Amerikaner haben einen MP3-Player oder einen iPod. 29% davon haben auch schon Podcasts genutzt.</summary>
   <content type="application/pdf" src="http://www.celawi.com/webtrends/20050415/pew.pdf"/>
   <updated>2005–04–15T10:15:02.021Z</updated>
   <id>http://www.wittenbrink.net/streams/atom/07_04</id>
</entry>
... 

Code-Beispiel: PDF-Dokument als Out-of-line-Inhalt in einem Atom-entry

Diese Form des Inhalts eines entry erlaubt es, Daten und Dokumente jeder Art zu distribuieren. Allerdings liegt es in vielen Fällen näher, durch einen Link auf solche Daten zu verweisen. Welche Möglichkeiten Links in Atom-Dokumenten bieten, wird die nächste Seite zeigen.

Das Element enclosure, das durch den Aufschwung des Podcastings berühmt geworden ist, benötigt Atom also nicht. Trotzdem kennt auch die Atom-Spezifikation als Gegenstück zu dem RSS-Element enclosure die Möglichkeit, ein link mit enclosure als Wert des Attributs rel zu verwenden. Diese Möglichkeit wurde erst spät in die Spezifikation von Atom aufgenommen, um die Feature-Gleichheit mit RSS sicherzustellen.

   

<< zurück vor >>

 

 

 

Tipp der data2type-Redaktion:
Zum Thema Newsfeeds mit RSS und Atom bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an: