XML Datei wird nicht richtig ausgegeben?

filament

Erfahrenes Mitglied
Hallo liebe Community,

ich habe auf meiner Webseite ein eigenes Script geschrieben zum News verwalten. Dieses habe ich erweitert, um einen RSS Feed zu erzeugen. Mir wird allerdings beim Aufrufen der XML Datei mitgeteilt, dass diese fehlerhaft wäre. Mach ich bei der Erzeugung etwas falsch****?

Hier mein Code:

PHP:
<?php
   if (isset($_SESSION["user_premium"]) AND $_SESSION["user_premium"] > 0)
   {
    unlink("rss/rss.xml");
    $fp = fopen("rss/rss.xml","w+");
    fwrite($fp,"<?xml version=\"1.0\" encoding=\"iso-8859-1\" ?>\n");
    $verbindung = mysql_connect($server, $user, $passwort) or die ("Es konnte keine Verbindung zum Server hergestellt werden!");
    mysql_select_db($datenbank) or die ("Diese Datenbank existiert nicht!");
    fputs($fp,"<rss version=\"2.0\">\n");
    fputs($fp," <channel>\n");
    fputs($fp,"  <title>RSS-Feed</title>\n");
    fputs($fp,"  <link>URL</link>\n");
    fputs($fp,"  <discription>Mybetstats News Feed</discription>\n");
    fputs($fp,"  <language>de-DE</language>\n");
    $datensatz = mysql_query("SELECT datum FROM news ORDER BY id DESC LIMIT 0,1");
    $row = mysql_fetch_assoc($datensatz);
    $pubDate = date("D, d M Y H:i:s T", $row['datum']);
    fputs($fp,"  <lastBuildDate>$pubDate</lastBuildDate>\n");
    $daten_news = mysql_query("SELECT * FROM news ORDER BY id DESC LIMIT 0,200");
    while ($row = mysql_fetch_assoc($daten_news))
    {
     $schrift3 = mysql_real_escape_string($row['schrift']);
     $autor3 = mysql_real_escape_string($row['autor']);
     $id3 = $row['id'];
     $text3 = mysql_real_escape_string($row['text']);
     fputs($fp," <item>\n");
     fputs($fp,"  <title>$schrift3</title>\n");
     fputs($fp,"  <author>$autor3</author>\n");
     fputs($fp,"  <pubDate>$pubDate3</pubDate>\n");
     fputs($fp,"  <link>http://www.seite.php?id=$id3</link>\n");
     fputs($fp,"  <discription>$text3</discription>\n");
     fputs($fp," </item>\n");
    }
    fputs($fp," </channel>\n");
    fputs($fp,"</rss>\n");
    fclose($fp);
    mysql_close($verbindung);
    echo "<p class='success'>RSS Datei erfolgreich aktualisiert!</p>";
   }
   else
   {
    echo "Du bist nicht berechtigt dazu oder nicht eingeloggt!";
   }
   ?>
 
Du kannst es dir ja gerne selbst ansehen: http://www.mybetstats.de/rss/rss.xml

Ich hab mir die XML runtergeladen und angesehen. Er gibt scheinbar einiges an Sachen richtig aus. Aber irgendwo mag er nicht mehr. Er sagt mir dann, dass er irgendwo Anführungszeichen erwartet hätte, die er aber nicht gefunden hat.

Aus dem Grund hatte ich versucht es mit mysql_escape_string umzuwandeln. Scheint nicht geklappt zu haben?

Im Prinzip habe ich es nur gemacht weil ich den Feed wo anmelden wollte und ich dort die Nachricht bekam, dass es keinen Link zu einem Feed gebe. Dann habe ich es hier aufgerufen und die Fehlermeldung gesehen. (Hab hier allerdings gerade nur nen IE6)

Den im Header habe ich nichts anders als bei meinen anderen Seiten gemacht, die aber funktioniert haben. Dort läuft es allerdings über Wordpress muss ich sagen.
 
Zuletzt bearbeitet:
Also bei mir im FF 8.0 siehts prima aus:

Mybetstats RSS-Feed



Mehr News in Zukunft
Wieder zurück..
Top-Wette des Wochenende, Dynamo Dresden gegen Hansa Rostock
Was ist mybetstats? Wetten analysieren einfach gemacht!

Wird als RSS Feed angeboten. Funktioniert 1a! Browserwechsel schon in Betracht gezogen? IE 6.0 is ja nicht grad.... nicht ja? ;-)
 
Naja war auf Arbeit. Hab zu hause mehrere Browser. Aber trotzdem sagt mir der Dienst es gibt keinen feed. Also scheint ja irgendwas nicht zu stimmen oder nicht? Schliesslich erkennt der dienst zwei andere feeds von mir auch? Oder könnte das daran liegen das in Wordpress der Ordner direkt feed heisst?
 
Ich hab das grad mal durch den XML-Validator von w3.org geschickt und bin auf den Fehler gestoßen:

<a href=\'http://www.sportwettenvergleich.net/\' target=\'_blank\'>Sportwettenanbieter im Vergleich</a>

Versuch doch mal

- nicht zu maskieren (\ vor dem ' weglassen)
- statt dem Single- (') ein Double-Quote (") zu verwenden
 
So nun bin ich zu Hause am Rechner und kann folgendes sagen. Mein Firefox zeigt mir den Feed auch korrekt an. Mein IE9 aber sagt genau das gleiche wie mein IE6 auf Arbeit.

Also ich hab mir das jetzt mal genau angeguckt und einige Änderungen auch in den Texten innerhalb der Datenbank vorgenommen. Hat aber nichts gebracht. Nun habe ich mir die Fehlermeldung mal genau angesehen. Er schreibt mir, dass das Start-Tag nicht mit dem End-Tag zusammen passt. Er scheint hier wohl die HTML Elemente durcheinander zu bringen denn laut Datei kommt <p>Text</p></discription>
 
Richtig, ich hab es sowohl mit w3 als auch validome versucht:

Fehler (2)ZeileDateiname:http://www.mybetstats.de/rss/rss.xml2Spalte:21 Fehler:Die Deklaration des Elementes 'rss' kann nicht gefunden werden. Fehlerstelle:<rss version='2.0'>

ZeileDateiname:http://www.mybetstats.de/rss/rss.xml182Spalte:1776 Fehler:Elemententyp "p" muss mit dem passenden Endtag "</p>" geschlossen werden. Fehlerstelle:...heiden, um Ihre Wetten noch genauer analysieren zu können!</discription>

Ein großes Problem sehe ich darin, dass das XML nicht formatiert ist, das könntest du so umgehen:

- Lade den kompletten XML-Output in simplexml_load_string()
- Du bekommst ein SimpleXMLElement zurück (vermutlich knallt es dort schon, was aber nicht schlecht wäre)
- Das SimpleXMLElement bietet eine Methode asXml() an, was dir dann das XML schön formatiert zurück geben sollte.

Wahlweise kannst du natürlich auch alles über DOM machen (ist meine persönliche Empfehlung).
 
Richtig, ich hab es sowohl mit w3 als auch validome versucht:



Ein großes Problem sehe ich darin, dass das XML nicht formatiert ist, das könntest du so umgehen:

- Lade den kompletten XML-Output in simplexml_load_string()
- Du bekommst ein SimpleXMLElement zurück (vermutlich knallt es dort schon, was aber nicht schlecht wäre)
- Das SimpleXMLElement bietet eine Methode asXml() an, was dir dann das XML schön formatiert zurück geben sollte.

Wahlweise kannst du natürlich auch alles über DOM machen (ist meine persönliche Empfehlung).

Okay, hab mir die Links mal angeschaut und parallel dazu meine xml so validiert, dass es zumindest erstmal angezeigt wird. Es funktioniert auch bei dem Anbieter und wird jetzt erkannt. Dazu habe ich den Text einfach als String genommen und erstmal die <p> und </p> durch "" ersetzt. Damit treten dann scheinbar keine Probleme mehr auf. Dazu habe ich festgestellt, dass es natürlich description heißen muss und nicht discription. Allerdings ist das noch nicht die schönste Lösung für das Problem.

DOM hört sich für mich an, als wenn ich mich in eine neue Sprache reinfuchsen muss. Das will ich eigentlich vermeiden, dass wäre dann doch zuviel aufwand.

Wenn ich dich richtig verstanden habe, dann nehme ich nun meinen kompletten Inhalt aus der Datenbank mit den XML Befehlen und stecke Sie in einen String.

PHP:
unlink("rss/rss.xml");
$string = "<?xml version='1.0' encoding='iso-8859-1' ?>\n<rss version='2.0'>\n<channel>\n<title>MyBetstats RSS-Feed</title>\n<link>http://www.mybetstats.de</link>\n<description>Mybetstats News Feed</description>\n<language>de-DE</language>\n";
$verbindung = mysql_connect($server, $user, $passwort) or die ("Es konnte keine Verbindung zum Server hergestellt werden!");
mysql_select_db($datenbank) or die ("Diese Datenbank existiert nicht!");
$datensatz = mysql_query("SELECT datum FROM news ORDER BY id DESC LIMIT 0,1");
$row = mysql_fetch_assoc($datensatz);
$pubDate = date("D, d M Y H:i:s T", $row['datum']);
$string.= "<lastBuildDate>$pubDate</lastBuildDate>\n";
$daten_news = mysql_query("SELECT * FROM news ORDER BY id DESC LIMIT 0,200");
while ($row = mysql_fetch_assoc($daten_news))
{
 $string.="<item>\n";
 $string.="<title>$row['schrift']</title>\n";
 $string.="<author>$row['autor']</author>\n";
 $string.="<pubDate>$row['datum']</pubDate>\n";
 $string.="<link>http://www.mybetstats.de/kommentare.php?id=$row['id']</link>\n";
 $string.="<description>$row['text']</description>\n";
 $string.="</item>\n";
}
$string.="</channel>\n";
$string.="</rss>\n";
mysql_close($verbindung);

Nun nehm ich den String und lade ihn mit simplexml_load:

PHP:
$xml = simplexml_load_string($string);

Danach nehme ich die Variable und mache ein Element daraus und gebe es dann aus?

PHP:
$new_xml = new SimpleXMLElement($xml);
echo $new_xml->asXML();

Falls richtig verstanden, wie speicher ich das nun in die XML Datei die auf meinem Server liegt? (Denn die Aktualisierung meiner XML geschieht beim Newsposten nicht beim Aufruf, weil ich dem Server die Last nehmen will)
 
Zuletzt bearbeitet:
Die Methode asXML() akzeptiert einen Parameter (default null), der den Dateinamen darstellt, unter dem die Datei gespeichert werden soll.

DOM ist das Document Object Modell, eine Technologie, mit der du immer dann zu tun hast, wenn du im Internet surfst. HTML ist eine Untermenge von XML und XML ist quasi der Quellcode des DOM.

Du kannst durch DOM eine XML-Root definiereren und dort Childs reinhängen. Das ist kein Hexenwerk, erfordert nur Sorgfalt beim Entwickeln. Macht sich aber durch prima Validierungsmöglichkeiten und nicht zu letzt sauberen PHP-Code bemerkbar. Das ist aber deine Entscheidung :-) Wenn du dich dem noch nicht gewachsen fühlst, ist SimpleXML evtl. erstmal die bessere Wahl.
 
Zurück