rss - xml: wie mache ich das richtig valid?
Rolf Rost
- xml
0 Cheatah2 Tim Tepaße
Hallo Forumsgemeinde,
hab nun, ach rss und xml studiert wie nie zuvor
und steh nun da wie ein Ochs vorm neuen Tor.
Fragen zu meinem RSSFeed:
Mein http://rolfrost.de/cgi-bin/rssfeed.cgi gibt als erstes einen header aus wie folgt:
print "Content-type: application/rss+xml\n\n";
und dann:
<?xml version="1.0" encoding="ISO-8859-1"?>
<rss version="2.0">
<channel>
dazwischen items like
<item>
<title>In eigener Sache</title>
<description>
content:encode
<![CDATA[1st]]>
</content:encode>
</description>
<link>http://rolfrost.de/cgi-bin/blog.cgi</link>
<pubDate>1129143045</pubDate>
</item>
</channel>
</rss>
Verschiedene FeedValidators meeckern mir die 2. Zeile an wo xml deklariert wird, dann die Zeile wo steht content:encode und dann meine Worte wo ä's, ö's, ü's und sowas drin vorkommen.
Das Windows Programm von http://www.feedreader.com/ kommt damit zurecht, aber ich möchte gerne sicher gehen ob der Code, den mein rssfeed.cgi sendet (samt Content-type) valid ist.
Das Windows Programm von http://www.feedreader.com/ kommt z.B. nicht
damit zurecht, wenn ich
encoding="ISO-8859-1"
oder die tags
</content:encode>
rausnehme, obwohl ich schon bei Harvard Law Beispiele gefunden habe wo das auch nicht notiert ist.
Bitte Euch um Hilfe, sehe auch gerne Links zum Schmökern zu diesem Thema.
Viele Grüße, Euer Rolf
Hi,
Verschiedene FeedValidators meeckern mir die 2. Zeile an wo xml deklariert wird,
das würde mir auch nicht so recht gefallen. Keine Whitespaces vor der XML-Deklaration.
dann die Zeile wo steht content:encode
Du hast kein xmlns:content deklariert.
und dann meine Worte wo ä's, ö's, ü's und sowas drin vorkommen.
Charset im HTTP-Header angeben. Besser: Alles, was nicht ASCII ist, kodieren.
Cheatah
hajo Hajo,
danke Dir!
Ein Fall für --morgen, ich lese das nach | suche das raus ;-)
Viele Grüße, Rolf
Hallo Rolf,
Ein paar Kritikpunkte, Tips und Anmerkungen dazu:
Keine Charset-Angabe in den HTTP-Headern
Whitespace vor der XML-Deklaration
Der Namensraum „content“ wurde nicht angegeben, dies könntest Du bequemerweise einfach in das rss-Element packen: <rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
Du verwendest im Namensraum „content“ ein Element namens „encode“. Solltest Du wirklich das gerade von mir deklarierte RSS 1.0 Modul „Content“ meinen, heisst das betreffende Element „encoded“. Beachte bitte auch, dass RSS 1.0 und RSS 2.0 ausser dem Daseinszweck in der Syntax eher weniger miteinander zu tun haben.
Die RSS 2.0 Spezifikation gibt in der ihr eigenen Schwabbeligkeit natürlich keine Schema für die XML-Struktur vor. Die verbreitete Praxis im Web seit einigen Jahren ist jedoch, das Element „description“ nur für Text beziehungsweise mit CDATA oder Entities kodierten Text zu nutzen. Tatsächlich platzieren alle mir bekannten Feeds, die aus was für Gründen auch immer das RSS 1.0 Modul Content in ihren RSS 2.0 Feed einbinden, das Element „content:encoded“ als direktes Kindelement von „item“, oft zusätzlich zum „description“-Element. Ich würde „content:encoded“ auf keinen Fall als Kindelement des Elementes„description“ positionieren, das ist einfach zu fehlerprovozierend.
Ich an Deiner Stelle würde eh ganz auf das RSS 1.0 Modul „Content“ verzichten, Herr Winer gibt selbst einige Beispiele, wie man HTML-Content innerhalb des Elementes „description“ kodieren kann. Ich würde an Deiner Stelle Beispiel 2 verwenden, das ist relativ der Gedankenwelt von XML nahe, außerdem setzen wir diese Methode hier im Forum mit Erfolg ein.
Solltest Du in den Titeln Deiner Blogeinträge auch HTML Elemente oder entity-kodierte-Zeichen außerhalb des Bereiches von Latin 1 einsetzen, empfiehlt es sich, den Inhalt ebenfalls mit der CDATA-Methode zu kodieren.
In allen „link“-Elementen Deines Feedes setzt Du dieselbe URL ein, ich hoffe, das ist nur ein Flüchtigkeitsfehler der Entwicklungsversion. Was bringt es mir, wenn ich in meinem RSS-Reader sehe, dass Du wieder was Neues geblogt hast, auf Enter haue und mir in meinem Browser dieselbe Seite angezeigt wird?
Best Practise ist es, es dem RSS-Readern so leicht wie möglich zu machen. Du solltest dringend erwägen, deswegen das Element „guid“ mit aufzunehmen, damit RSS-Reader geupdatete oder modifizierte Items im neu gezogenen RSS-Feed mit bereits archivierten Items abgleichen können. Solltest Du für Deine Blogeinträge eindeutige, sich nicht ändernde URLs haben, böte es sich an, diese zu verwenden, in diesem Fall solltest Du das Element „guid“ mit dem Attribut „isPermaLink“ mit dem Wert „true“ ausstatten.
Du verwendest als Inhalt des Elementes „pubDate“ in Deinem derzeitigen Feed offenbar einen Unix-Timestamp. Dies ist falsch. Die RSS 2.0 Spezifikation sagt eindeutig, dass der Inhalt ein Datum nach RFC 822 sein sollte, also wie in E-Mails.
(Ich selber würde eher das Format Atom 1.0 nutzen, das ist nicht so schwabbelig wie RSS 2.0, meiner Meinung nach durchdachter und dürfte von den meisten Feed Parsern inzwischen verstanden werden, wenn diese mit dem Lauf der Zeit mitgehalten haben.)
Tim
Vielen Dank Tim!
Den Link für jeden Feed werde ich auf jeden Fall noch so anpassen, dass er direkt auf den blog-Eintrag zeigt, muss dazu aber noch im blog.cgi selbst einen Parameter einbauen... coming soon ;-)
Unix-Timestamp -> RFC 822, klaro, wird auch noch.
Viele Grüße, Rolf
Hallo Tim,
noch einmal danke, mein Feed ist nun valid, zumindest sagt "der" das:
http://feedvalidator.org/check.cgi?url=http%3A%2F%2Frolfrost.de%2Fcgi-bin%2Frssfeed.cgi
Eine Frage noch:
wenn ich in der xml Deklaration das encoding="ISO-8859-1" weglasse, bockt mein FeedReader, wohingegen dieser den RSS Feed vom hiesigen Forum einwandfrei darstellt (da ist default utf8).
Hab ich da was übersehen?
Falls Du Lust und Zeit hast, guck bitte noch einmal rein.
Ansonsten schönes Wochenende und viele Grüße
Rolf
Hallo Rolf,
wenn ich in der xml Deklaration das encoding="ISO-8859-1" weglasse, bockt mein FeedReader, wohingegen dieser den RSS Feed vom hiesigen Forum einwandfrei darstellt (da ist default utf8).
Bei XML-Dokumenten ohne Angabe der Kodierung wird UTF-8 oder UTF-16 angenommen, das muss auch jeder XML-Prozessor verstehen können. Andere Kodierunge müssen hingegen ausgezeichnet werden.
Falls Du Lust und Zeit hast, guck bitte noch einmal rein.
Sieht gut aus, auch wenn ich die Links persönlich nicht in CDATA gepackt hätte. Und ich würde die Kodierung sicherheitshalber auch als HTTP Header senden, wie schon erwähnt.
Tim