Hallo,
nachdem zwar viele meinen Thread geklickt hatten, jedoch niemand einen Beitrag geschrieben hatte, bin ich u.a. mit Hilfe anderer Foren zu einem Ergebnis gekommen, das ich hier vorstellen möchte. Zunächst die Antworten auf meine eigenen Fragen:
- Wie kann ich die Anzahl der ITEM-Einträge in der XML zählen, um die Zahl in der Scheife einzubinden (bisher manuell)
Antwort:
$items = $xmlDoc->getElementsByTagName("item");
$data = array();
for ($i = 0; $i < $items->length; $i++)
- Gibt es eine andere, elegantere Möglichkeit, die XML-Nodes anzusprechen?
Antwort:
$item = $items->item($i);
$data[] = array(
'pubdate' => $item->getElementsByTagName('pubDate')->item(0)->textContent,
'title' => $item->getElementsByTagName('title')->item(0)->textContent,
'description' => $item->getElementsByTagName('description')->item(0)->textContent,
'link' => $item->getElementsByTagName('link')->item(0)->textContent);
- Wie steht es mit Umlauten? Im XML sieht noch alles gut aus - in php dann nicht mehr. Ergebnis hier:
Antwort:
// Datum erst in ISO-Zeichensatz wandeln, dann zu einem Timestamp, dann zu JJJJ-MM-TT formatieren
$datum = date("Y-m-d",strtotime(utf8_decode($data[$i]['pubdate'])));
// mysql_real_escape_string: Filtern bzw. Ersetzen von Sonderzeichen in der Variablen, damit es beim Schreiben in die DB zu keinem Fehler kommt
$titel = mysql_real_escape_string(utf8_decode($data[$i]['title']));
$beschreibung = mysql_real_escape_string(utf8_decode($data[$i]['description']));
$link = utf8_decode($data[$i]['link']);
Und hier des gesamte Inhalt des Scriptes:
<?
include ("db_conn_ips.inc.php");
// Aufbauen einer Verbindung zur Datenbank
$db_connection_id = db_connect();
// Zunächst wird die Webseite downgeloaded und in einem File gespeichert
$remotefile = "http://www.ndr.de/ndr2/podcast2956.xml";
$localfile = IPS_GetKernelDir()."\\scripts\\steffi.xml";
// Downloaden
$content = @file_get_contents($remotefile);
if((strpos($http_response_header[0], "200") === false))
{
return;
}
// Speichern
file_put_contents( $localfile, $content );
$xmlfile= "steffi.xml";
$xmlDoc = new DOMDocument();
$xmlDoc->load($xmlfile);
$link = $xmlDoc->getElementsByTagName("link");
$num = $link->length;
$items = $xmlDoc->getElementsByTagName("item");
$data = array();
for ($i = 0; $i < $items->length; $i++)
{
$item = $items->item($i);
$data[] = array(
'pubdate' => $item->getElementsByTagName('pubDate')->item(0)->textContent,
'title' => $item->getElementsByTagName('title')->item(0)->textContent,
'description' => $item->getElementsByTagName('description')->item(0)->textContent,
'link' => $item->getElementsByTagName('link')->item(0)->textContent);
// Datum erst in ISO-Zeichensatz wandeln, dann zu einem Timestamp, dann zu JJJJ-MM-TT formatieren
$datum = date("Y-m-d",strtotime(utf8_decode($data[$i]['pubdate'])));
// mysql_real_escape_string: Filtern bzw. Ersetzen von Sonderzeichen in der Variablen, damit es beim Schreiben in die DB zu keinem Fehler kommt
$titel = mysql_real_escape_string(utf8_decode($data[$i]['title']));
$beschreibung = mysql_real_escape_string(utf8_decode($data[$i]['description']));
$link = utf8_decode($data[$i]['link']);
$timestamp = time();
/*
// Zum Testen und Anzeigen in der IPS-Console
echo $datum."
";
echo $titel."
";
echo $beschreibung."
";
echo $link."
";
echo "
";
*/
$sql = "SELECT count(*) AS anzahl FROM ips.steffi WHERE titel = '$titel'";
$query = mysql_query($sql);
$row = mysql_fetch_object($query);
if($row->anzahl > 0)
echo "Dieser Eintrag existiert bereits!!!!";
else
{
// SQL-Befehl festlegen
$sql = "INSERT INTO ips.steffi (timestamp, datum, titel, beschreibung, url) VALUES (CURRENT_TIMESTAMP, '$datum', '$titel', '$beschreibung', '$link')";
// SQL-Befehl ausführen
mysql_query($sql,$db_connection_id) or die (mysql_error());
}
}
// Verbindung zur DB schließen
mysql_close($db_connection_id);
?>
Hinweis: in der db_conn_ips.inc.php versteckt sich die Funktion db_connect().
Wenn es Anregungen zur Verbesseung gerade bei der Syntax gibt, bitte ich um Zuschriften. Danke.