RSS-Feed-Probleme beim Link-Attribut

Hallo,

ich arbeite gerade an einem RSS-Reader und bin auf ein Problem gestoßen, das ich mir beim besten Willen nicht erklären kann.

Der Reader funktioniert für bspw. http://news.google.com/news?ned=us&topic=h&output=rss schon perfekt, das war aber nur zum Testen.

Wollte einen personalisieren Feed der Süddeutschen Zeitung haben, den man sich unter http://www.sueddeutsche.de/news?search=Suchbegriff+eingeben einrichten kann.
Bsp.: http://www.sueddeutsche.de/news/rss?search=HTML&sort=date

Allerdings wird hier Channel-Link nicht gespeichert, bei der Abfrage zum Google-Link klappt es wunderbar. Das Link-Attribut ist auch im RSS zu finden (< link >http://www.sueddeutsche.de< /link >), aber es kann scheinbar nicht gespeichert werden.
Habe mal FeedBucket, ein Online-RSS-Reader, die gleiche URL gegeben, dieser kann den Link wunderbar auslesen (http://www.feedbucket.com/?src=http%3A%2F%2Fwww.sueddeutsche.de%2Fnews%2Frss%3Fsearch%3DHTML%26sort%3Ddate)

Die anderen Attribute, die die SZ mitliefert (title, description, pubDate, managingEditor, etc.), kann ich ebenfalls problemlos auslesen, nur das Link-Attribut nicht.

Jedoch bei einem SZ-eigenen RSS-Feed wie http://rss.sueddeutsche.de/rss/Eilmeldungen kann ich das Link-Attribut auslesen, nur scheinbar nicht bei dem personalisierten Feed.

Hier mal der relevante Teil des PHP-Scripts:

$xml=("http://www.sueddeutsche.de/news/rss?search=HTML&sort=date");

$xmlDoc = new DOMDocument();
$xmlDoc->load($xml);

//get elements from "<channel>"
$channel=$xmlDoc->getElementsByTagName('channel')->item(0);
$channel_title = $channel->getElementsByTagName('title')
->item(0)->childNodes->item(0)->nodeValue;

$channel_link = $channel->getElementsByTagName('link')
->item(0)->childNodes->item(0)->nodeValue;
echo "Channel-Link: '$channel_link'<br />";

$channel_desc = $channel->getElementsByTagName('description')
->item(0)->childNodes->item(0)->nodeValue;

//output elements from "<channel>"
echo("<p><a href='" . $channel_link
  . "'>" . $channel_title . "</a>");
echo("<br>");
echo($channel_desc . "</p>");

Ich wäre froh, wenn mir jemand die Ursache für dieses Problem erklären könnte.

LG, DMan

getElementsByTagName gibt alle Element zurück, dessen localName der angegebene Parameter, in deinem Fall link, ist. Das trifft bei dem Feed der Süddeutschen auch auf das Element <atom:link ... /> zu. atom ist der Namespace und link ist der lokale Name. Deswegen ist item(0) nicht das erste <link> Element sondern trifft in dem Fall auf <atom:link> zu, welches keinen nodeValue hat und somit auch nichts ausgegeben wird.

Es gibt die Möglichkeit getElementsByTagNameNS zu nutzen, um bestimmte Elemente eines Namespaces zu ermitteln, ich konnte allerdings auf der schnelle nicht herausfinden, wie man das für den standard Namespace (ohne url) macht, wenn das überhaupt geht.

Alternativ würde ich sagen solltest du einfach XPath verwenden, bei dem Namespaces explizit angegeben werden müssen, wenn diese ausgelesen werden sollen. Gibt man keine Namespaces an, werden nur die Elemente aus dem standard Namespace gewählt.

Beispiel

<?php

$xml = "http://www.sueddeutsche.de/news/rss?search=HTML&sort=date";

$xmlDoc = new DOMDocument();
$xmlDoc->load($xml);

$xpath = new DOMXpath($xmlDoc);

//get <channel> element
$channel = $xpath->query('/rss/channel')->item(0);

// get direct descendants (title, link and description) of the <channel> element
$channel_title = $xpath->query('title', $channel)->item(0)->textContent;
$channel_link = $xpath->query('link', $channel)->item(0)->textContent;
$channel_desc = $xpath->query('description', $channel)->item(0)->textContent;

echo "Channel-Link: '$channel_link'<br />";
echo("<p><a href='" . $channel_link . "'>" . $channel_title . "</a>");
echo("<br>");
echo($channel_desc . "</p>");

// beispiel auslesen des atom:link elements.
$xpath->registerNameSpace('atom', 'http://www.w3.org/2005/Atom');
$atom_link = $xpath->query('atom:link', $channel)->item(0);
echo "Atom Link Href: ".$atom_link->getAttribute('href');
1 „Gefällt mir“

Hey Balmung,

habe das gar nicht mitbekommen, vielen Dank für die Hilfe! Bin jetzt auf xPath umgestiegen und habe dein Script benutzt, vielen Dank erneut dafür!

LG, DMan