Bookmarks aus File mit PHP auslesen & in MySQL Tabelle schreiben
Sascha Blum
- xml
Hallo,
ich habe ein Problem, bei dem ich leider nicht weiterkomme. Um es vorweg zu
sagen ich bin kein Profi in Sachen PHP, stehe eher noch am Anfang und mit
XML hatte ich bis jetzt noch nichts zu tun ...
Nun ich möchte folgendes machen:
Datei, die Bookmarks enthält auslesen, die Datei ist im XML-Format
aus der Datei sollen die einzelnen Tags aufgeteilt werden in die
Variablen $titel und $url
es werden nur die Inhalte von Titel und die URL benötigt
aus ausgelesenen Inhalte also $titel und $url sollen letztendlich
in eine MySQL-Tabelle zur Weiterverarbeitung geschrieben werden.
Titel + URL = 1 Datensatz / 2 Felder(Spalten)
Die Datei die ich auslesen möchte, ist so aufgebaut:
// Dateianfang
<!DOCTYPE xbel>
<xbel folded="no" >
<folder folded="no" >
<bookmark icon="www" href="http://www.blablabla.de/" >
<title>Willkommen bei blablabla</title>
</bookmark>
<bookmark icon="www" href="http://www.blablabla2.de/" >
<title>Willkommen bei blablabla 2</title>
</bookmark>
// usw. halt
</xbel>
// Dateiende
Wie gesagt ich brauche nur das was zwischen <titel> </titel> als Wert $titel
sagen wir mal und das was zwischen href" und " > steht als Wert $url, also
die reine URL daraus.
Nun das ganze hab ich erstmal mit einer Bildschirmausgabe versucht ohne den
MySQL Datenbankteil, doch alleine da scheitert das ganze, also irgendwie
funktioniert es nicht, das ich den Wert $titel oder $url als Ergebnis
ausgegeben bekomme ...
Bis jetzt sieht das Script wie folgt aus:
// Script Anfang
<?PHP
$file = "bookmarks2.xml";
function startElement($parser, $name, $attrs) {
global $data;
switch ($name) {
case "bookmark":
$data["icon"] = $attrs["icon"];
$data["href"] = $attrs["href"];
break;
case "title":
$data["title"] = "";
break;
default:
die("unknown tagdata $name");
break;
}
}
function characterData($parser, $data) {
global $data;
$data["title"] .= $data;
}
function endElement($parser, $name) {
global $data;
switch($name) {
case "bookmark":
print $titel;
$data = array();
break;
case "title":
break;
default:
die("unknown tagdata $name");
break;
}
}
$xml_parser = xml_parser_create();
// use case-folding so we are sure to find the tag in $map_array
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, true);
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");
if (!($fp = fopen($file, "r"))) {
die("could not open XML input");
}
while ($data = fread($fp, 4096)) {
if (!xml_parse($xml_parser, $data, feof($fp))) {
die(sprintf("XML error: %s at line %d",
xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser)));
}
}
xml_parser_free($xml_parser);
?>
// Script Ende
Kann mir jemand bei meinem Problem weiterhelfen? Habe schon stundenlang im
Internet über google.de versucht darüber Infos zu bekommen, wie man so
etwas realisieren kann, doch ich fand da nichts passendes, das mir ein
wenig weiterhelfen könnte ...
Besten Dank vorab.
MfG.
Sascha
<folder folded="no" >
Der tag wird nicht geschlossen (eventuell nur im posting vergessen).
function characterData($parser, $data) {
global $data;
Hier gibts gröbere Benamsungskonflikte, die zu komplexen Fehlern führen.
function endElement($parser, $name) {
[...]
print $titel;
$titel ist hier nicht definiert.
Mein simpler Vorschlag wäre der folgende (angelehnt an http://www.webmasterbase.com/article/560:
$in_bookmark=false;
function startElement($parser,$name,$attrs) {
global $in_bookmark,$tag,$result;
if ($in_bookmark) {
$tag=$name;
} elseif($name=='BOOKMARK') {
$in_bookmark=true;
$result['icon']=trim($attrs['ICON']);
$result['href']=trim($attrs['HREF']);
}
}
function endElement($parser,$name) {
global $in_bookmark,$result;
if($name=='BOOKMARK') {
$in_bookmark=false;
print_r($result);
// $result=array();
}
}
function characterData($parser,$data) {
global $in_bookmark,$tag,$result;
if($in_bookmark) {
switch($tag) {
case 'TITLE':
$data=trim($data);
if(!empty($data)) {
$result['title']=$data;
}
// break;
}
}
}
Abgesehen davon würde ich an Deiner Stelle überlegen, die Daten folgendermaßen abzulegen oder mich eventuell sogar in RDF (http://www.w3.org/RDF/) einzulesen:
<bookmark>
<icon>www</icon>
<link>http://www.blablabla.de/</link>
<title>Willkommen bei blablabla</title>
</bookmark>