Eventuell Problem mit simplexml_load_file

shredder01

Mitglied
Problem mit simplexml_load_file

Hallo,

ich experimentiere seit ein paar Tagen mit der Google Maps API herum und versuche gerade ein PHP-Skript zum geocodieren von Adressdaten aus einer MySQL-Datenbank für meine Zwecke zum laufen zu bekommen. Das Ganze beruht auf folgendem Tutorial http://code.google.com/apis/maps/articles/phpsqlgeocode.html#samplecode.

Das Problem ist nun folgendes: Solange ich noch die originalen amerikanischen Adressdaten in der Datenbank hatte funktionierte es einwandfrei, sobald ich aber deutsche Adressdaten in die Datenbank eingetragen hatte bricht das Skript an der Stelle wo via simplexml_load_file die Koordinaten vom Googleserver abgefragt werden ab.
Der komplette Code ist unter folgender Adresse sichtbar: http://gmaps-samples.googlecode.com/svn/trunk/articles-phpsqlgeocode/phpsqlgeocode_xml.php (allerdings ohne meinen API-Key). Das Skript auf meinem Server kann über http://mobil-im-rollstuhl.de/geocode_request.php aufgerufen werden.

In der Datenbank sind die Daten utf8_unicode_ci kodiert.
Ich habe mir zu Testzwecken das Skript mal etwas umgestrickt, um mir nur die URLs, die zum Abfragen des Geocoders aufgerufen werden, mal anzeigen zu lassen. Die angezeigten URLs hab' ich dann nacheinander mal im Browser aufgerufen und bekam in diesem Fall ein wunderschönes XML-Dokument als Antwort. Unter folgender URL nachprüfbar http://mobil-im-rollstuhl.de/geocode_test.php. Die URL die das Skript ausgibt einfach im Browser aufrufen.
Hm, und weil es auf diese Weise funktioniert nehme ich an das simplexml_load_file mit irgendetwas nicht klar kommt. Ich weis bloß nicht womit.

Vielleicht kann mir ja jemand auf die Sprünge helfen.
Danke schonmal im voraus.

Sven

P.S.: Habe nach einem Tipp inzwischen mal etwas rumgebastelt und die Zeile
PHP:
$xml
=simplexml_load_file($request_url) or die("url not loading");
in folgendes geändert
PHP:
$handle = fopen($request_url, "rb") or die("url not loading");
    $text = stream_get_contents($handle);
    fclose($handle);
    $text = htmlentities($text,ENT_COMPAT,'UTF-8');
    $xml = simplexml_load_string($text);

Dann habe ich mir $text vor und nach der Behandlung mit htmlentities ausgeben lassen und folgendes erhalten:
$text before htmlentities= Hans-Beimler-Str. 1-3, 17491 Greifswald,
Deutschland200geocode
Hans-Beimler-Straße 1, 17491 Greifswald, Bundesrepublik Deutschland
DEMecklenburg-VorpommernGreifswaldGreifswaldHans-Beimler-Straße
11749113.397400,54.088696,0
$text=

Plus die Fehlermeldung "Address Hans-Beimler-Str. 1-3, 17491 Greifswald, Deutschland failed to geocoded. Received status ", die erscheint wenn der zurückgelieferte Statuscode nicht 200 (für alles OK) ist und auch nicht 620 (für zu viele Zugriffe in zu kurzer Zeit).

Das heißt also ich bekomme etwas vom Geocoder, was aber irgendwie noch die falsche Kodierung oder was auch immer hat. Außerdem heißt das htmlentities lösen mein Problem nicht, aber was dann? Was ist an dem was der Geocoder liefert falsch, das simplexml_load_file nichts damit anfangen kann?

P.P.S.: So und hier noch das eigentlich wichtigste ... die Fehlermeldungen von PHP (das kommt davon wenn man display_errors abschaltet und dann aber vergißt mal in die Errorlog-Datei zu schauen ;)) :
1. Fehlermeldung bei Verwendung von $xml=simplexml_load_file($request_url) or die("url not loading") :
Warning: simplexml_load_string(): Entity:line 1: parser error:Start tag expected, '<' not found in /srv/www/vhosts/mobil-im-rollstuhl.de/geocode_request.php on line 38
Warning: simplexml_load_string():http://maps.google.com/maps/geo?output=xml&key=ABQIAAAAl-D-juEBJBl1QtEOkEA4xxRq7 in /srv/www/vhosts/mobil-im-rollstuhl.de/geocode_request.php on line 38
Warning: simplexml_load_string():^ in /srv/www/vhosts/mobil-im-rollstuhl.de/geocode_request.php on line 38
2. Fehlermeldung bei Verwendung von
$handle = fopen($request_url, "rb") or die("url not loading");
$text = stream_get_contents($handle);
fclose($handle);
$text = htmlentities($text,ENT_COMPAT,'UTF-8');
$xml = simplexml_load_string($text);
Warning: htmlentities():Invalid multibyte sequence in argument in /srv/www/vhosts/mobil-im-rollstuhl.de/geocode_request.php on line 43

Das bestätigt zwar meine Vermutung, das simplexml_load_file (wieso wird eigentlich simplexml_load_STRING bemängelt?) mit dem gelieferten XML-Dokument nicht klar kommt (wahrscheinlich wegen Umlauten u.ä., weil es bei amerikanischen Adressen nicht auftritt), aber ich weiß jetzt auch nicht womit und wie ich das XML-Dokument behandeln kann damit SimpleXML damit klar kommt oder wie ich diese Hürde anders überwunden kriege.

Hat vielleicht jemand einen Tipp? Danke.
 
Zuletzt bearbeitet:
Ok, ich hab eine Lösung gefunden, die allerdings nichts mit PHP zu tun hat.
Wenn man im Originalskript in der URL oder Query, die an den Geocoder gesandt wird, "&oe=utf-8" einfügt wird irgendwie eine UTF-8-Kodierung erzwungen. Scheint also, dass das was ich vorher vom Geocoder bekommen hab' kein wirkliches utf8-codiertes XML war sondern nur so tat.

Vielleicht hilft das ja jemand weiter, der mit ähnlichem experimentiert.
 
Zurück