PHP XML parsen / Aufbereitung für DB-Übernahme (z. B. ofdb)

WulfmanGER

Commander
Registriert
Juli 2005
Beiträge
2.412
Hi

für eine kleine private (!) Filmdatenbank, hätte ich gerne noch Film-Infos ...

ofdb.de bietet hier die möglichkeit gezielt per XML Daten zu Importieren: http://ofdbgw.scheeper.net/movie_ext/2745.xml

Nur bekomme ich diese Daten noch nicht in eine DB rein (bzw. zum testen lass ich mir die per Echo ausgeben) - da fehlt mir ein klein wenig Know-How (wie man etwas in eine DB bekommt, weiß ich schon *G*; es geht um das auslesen der xml-Tags):

Habe bei php.net auch eine relativ Simples Script gefunden:

Code:
<?php
// Extracts content from XML tag

function GetElementByName ($xml, $start, $end) {

    global $pos;
    $startpos = strpos($xml, $start);
    if ($startpos === false) {
        return false;
    }
    $endpos = strpos($xml, $end);
    $endpos = $endpos+strlen($end);   
    $pos = $endpos;
    $endpos = $endpos-$startpos;
    $endpos = $endpos - strlen($end);
    $tag = substr ($xml, $startpos, $endpos);
    $tag = substr ($tag, strlen($start));

    return $tag;

}

// Open and read xml file. You can replace this with your xml data.

$file = "http://ofdbgw.scheeper.net/movie_ext/2745.xml";
$pos = 0;
$Nodes = array();

if (!($fp = fopen($file, "r"))) {
    die("could not open XML input");
}
while ($getline = fread($fp, 4096)) {
    $data = $data . $getline;
}

$count = 0;
$pos = 0;

// Goes throw XML file and creates an array of all <XML_TAG> tags.
while ($node = GetElementByName($data, "<resultat>", "</resultat>")) {
    $Nodes[$count] = $node;
    $count++;
    $data = substr($data, $pos);
}

// Gets infomation from tag siblings.
for ($i=0; $i<$count; $i++) {
$titel= GetElementByName($Nodes[$i], "<titel>", "</titel>");
$beschreibung = GetElementByName($Nodes[$i], "<beschreibung>", "</beschreibung>");
$bild = GetElementByName($Nodes[$i], "<bild>", "</bild");
// $kurzbeschreibung = GetElementByName($Nodes[$i], "<kurzbeschreibung>", "</kurzbeschreibung");
$jahr = GetElementByName($Nodes[$i], "<jahr>", "</jahr");
}

// Ausgabe Test [nur Test ob ich die gewünschten Daten ausgelesen bekomme; Import SQL dann kein Problem]
echo $titel ." (".$jahr.")<br />";
// echo $kurzbeschreibung ."<br />";
echo $beschreibung ."<br />";
echo "<img src=".$bild." /> <br />";
?>

Mit dem Script komme ich an alle Tags in der XML dran die "einmalig" sind. (Beschreibung, Kurzbeschreibung, Jahr usw.). Tags die nicht einmalig sind, werden allerdings nur mit ersten Vorkommen genommen (wie der Filmtitel im TITEL-Tag - das kommt mehrfach vor [danach unter GENRE]).

Wo ich nicht rankomme, sind Tags mit mehreren Einträgen:
In dem Beispiel oben:
Genre => Hat 2 Titel-Einträge (Komödie und Drama)
Genre bekomme ich angezeigt wenn ich

Code:
GetElementByName($Nodes[$i], "<genre>", "</genre");
nutze. Allerdings hab ich dann in der Ausgabe folgendes Stehen:
<titel>Komödie</titel>
<titel>Drama</titel>

Ich müsste das in ein Array speichern? Ohne <titel>-Tag. In die Datenbank würde ich das dann in ein Feld eintragen: "Komödie, Titel" (was ich hoffentlich später wieder getrennt bekomme *G*; weil jedes Genre soll anklickbar sein).

Problematischer wirds bei den Personen-Tags: Hier interessieren mich nur Tags wo auch eine ausgefüllte Rolle existiert. Auch die möchte ich im ersten Step einmal ausgegeben bekommen (wie gesagt: bekomme ich es mit echo ausgeben, bekomm ich es auch in eine SQL-DB rein). Aber ich weiß nicht wie :(

Hat hier jemand vielleicht eine Idee? Oder vielleicht schon mal ein Script für ofdb.de gefunden welches problemlos zugriff auf ALLE Tags gewährt?

Gruß

PS: imdb.com (bzwl. de) hat mir zuviel englische Einträge; wobei die Schauspieler-Rollen-Liste dort gepflegter sind; aber erstmal ofdb.de "bändigen" ;)
 
Ich kenne mich leider nicht so richtig aus, deshalb frage ich einfach mal: Kann man per PHP auf Bibliotheken zugreifen?
Wenn ja, gäbe es libxml2, mit der man ganz einfach XML-Kram auslesen kann.
 
Hi ich bin zwa nicht mehr so mit PHP vertraut, aber eine immer gut Funktionierende methode xml Daten schnell und sauber einzulesen ist die Event basierende . Das heisst bei einem Start-Tag (<titel>) wird eine Methode aufgerufen, bei Characters (Avatar - Der Film) und bei einem End-Tag (</titel>) wird wieder eine Methode aufgerufen.

Hier die Php Site dafür:
http://php.net/manual/de/book.xml.php

Damit solltest du auch dein Problem gelöst haben, wie du die XML Tags wegläst um deim Array zu füllen =).


LG raeNsen
 
die Scripte dort hab ich mir mal angeschaut (ich lerne sowas besser aus Beispielen als aus den Beschreibungstexten). Das einzige gute Beispiel was ich dort gefunden habe, ist das obere. Nur da komm ich net so weiter.

Kennt ihr den vielleicht paar gute XML-Parser scripte in php die ich mir mal anschauen kann?


Ich hab zwar ein ofdb.de-Script gefunden (Filmverwaltung) - aber das Teil macht es sich ganz kompliziert indem die html-Seite geparsed wird - viel spass bei der nächsten Seitenumstellung ;) ... das XML wird da leider nicht ausgelesen
 
PHP:
<?php

$xml = simplexml_load_string(file_get_contents('http://ofdbgw.scheeper.net/movie_ext/2745.xml'));

echo (string) $xml->resultat->titel; // Stadtneurotiker, Der

echo "\n\n";

foreach($xml->resultat->besetzung->person as $darsteller) {
	echo (string) $darsteller->name . "\n";
}

ist ganz einfach ;)

das casten ist immer notwendig da alles SimpleXML-Objekte sind.
 
Hi

Danke @ ice-breaker! Das wars - habs noch ein wenig angepasst und ballere gerade meine Testdatenbank zu ;). Das System ist wirklich einfach. Da tun sich für meine Statistikwut sogar neue perspektiven auf ;)

Gruß
Ergänzung ()

Hi

jetzt hab ich ein Problem - k.a. woran das liegt:(

Ich hab mein DB-Import-Script soweit durch - habs auf Personen und Film-Infos angewandt. Es klappt auch - hab jetzt mal testweise schon 5 verschiedene Filme reingepappt - nur EINER will einfach nicht. Ich bekomme die Personen aus dem XML raus, ich bekomme die Einträge aus Genre und das Produktionsland raus - aber sonst NICHTs.

PHP:
$xml = simplexml_load_string(file_get_contents('http://ofdbgw.scheeper.net/movie_ext/188514.xml')); // Avatar

$titel = $xml->resultat->titel;
$alternativ = $xml->resultat->alternativ;
$jahr = $xml->resultat->jahr;
$ofdbbild = "123.jpg";
$cover = "123.jpg";
$kurzbeschreibung = $xml->resultat->kurzbeschreibung;
$beschreibung = $xml->resultat->beschreibung;
$note = $xml->resultat->bewertung->note;
$stimmen = $xml->resultat->bewertung->stimmen;
$platz = $xml->resultat->bewertung->platz;
$imdb = $xml->resultat->imdbid;
echo $imdb; // TEST

	$insert = "INSERT INTO filme(filmidofdb,titel,alternativ,jahr,bild,cover,kurzbeschreibung,beschreibung,note,stimmen,platz,filmidimdb) VALUES ('$filmid', '$titel', '$alternativ', '$jahr', '$ofdbbild', '$cover', '$kurzbeschreibung', '$beschreibung', '$note', '$stimmen', '$platz', '$imdb')";
	$query = mysql_query($insert);
mit dem echo da drin hab ich mal alle Variablen durchgeprüft - sie werden angezeigt. Haben Inhalt. Aber ich bekomme die nicht mit dem insert in die DB rein. Wie gesagt: div. andere Filme klappen!

Folgendes Snipet auf gleiche ID angewandt klappt auch:
PHP:
foreach($xml->resultat->genre->titel as $genretyp) {

// DB-Insert  
	$insert = "INSERT INTO filme_genre(filmidofdb,genre) VALUES (' $filmid ',' $genretyp ')";
	$query = mysql_query($insert);
}

Was stimmt da net?! :(

Hier noch der DB-Aufbau für "filme":
Code:
filmidofdb   	int(8)  
titel  	varchar(256)
alternativ  	varchar(256)
jahr  	int(4)
bild  	varchar(100)
cover  	varchar(100)
kurzbeschreibung	varchar(256)
beschreibung  	text 	
note  	varchar(5)
stimmen  	int(6)
platz  	int(6)
filmidimdb  	varchar(8)
(alles wo Text reinkommen kann, ist als Kollation utf8_general_ci eingetragen)

Gruß
Ergänzung ()

Hi

so problem gelöst ... addslashes muss ich bei den Beschreibungen anwenden. Im Text befanden sich ' - das darf ja nicht unmaskiert in die DB.

Gruß
 
Zurück
Oben