2011-01-04 21 views
5

Ich benutze die Google Wetter API für ein Widget.Xml Parse Fehler: 'Ungültiges Zeichen'

Alles ist in Ordnung und Dandy, außer dass heute ein Problem aufgetreten ist, das ich nicht lösen kann. Wenn mit diesem Ort genannt:

http://www.google.com/ig/api?weather=dunjkovec,medimurska,croatia&hl=en

ich diesen Fehler:

XML parse error 9 'Invalid character' at line 1, column 169 (byte index 199) 

Ich vermute, dass das Problem hier: Nedelišće

Der Codeblock ist diese:

$ Daten ist die con Das Zelt der Werte xml und $ ist leer.

Kann mir jemand helfen? Vielen Dank!

EDIT ----------------------------------

Nach Husseins Post Lesen entdeckte ich, dass Das Problem besteht darin, wie die Datei abgerufen wird.

Ich habe versucht, File_get_contents und cURL. Beide gibt zurück:

das ist die Zeile, die Probleme verursacht. Oder so, dachte ich! Ich probierte diesen html_entity_decode ($ data, ENT_NOQUOTES, 'UTF-8') und es funktionierte nicht, also machte ich eine Entdeckung, ich kann den Inhalt des xml nicht widerhallen, ich kann sie nur print_r und die Ergebnisse sehen die HTML-Quelle! Mit jedem anderen Ort auf der Welt funktioniert es, nur dieser schafft Probleme ... Ich möchte weinen :-(

EDIT 2 -------------------- ------------

Für jeden, den sie interessiert ich das Problem mit diesen Codezeilen nach dem Abrufen der xML-Datei aus dem api festgelegt. die xml

$data = mb_convert_encoding($data, 'UTF-8', mb_detect_encoding($data, 'UTF-8, ISO-8859-1', true)); 
$data = html_entity_decode($data,ENT_NOQUOTES,'UTF-8'); 

dann analysieren es funktioniert wie ein Charme Ich markierte Husseins Antwort, weil es mich auf die richtige Spur gebracht hat

+0

Was ist Ihre PHP-Version? – Tomalak

+0

PHP-Version kann ein Problem mit der Codierung sein. Google identifiziert den XML-Code korrekt als UTF-8 in der Kopfzeile, nicht jedoch in der XML-Deklaration. Wie werden Sie die XML-Datei abrufen und speichern, bevor Sie sie laden? Abhängig von der Umgebungseinstellung ist es möglich, dass es implizit zu ISO-8859-1 konvertiert wurde, was beim Laden zu einem ungültigen Zeichenfehler führen würde. –

+1

Herzlichen Glückwunsch! Das ist noch bessere Lösung .. Danke für den Austausch :) – eHussain

Antwort

4

Nach dem Lesen Ihres Problems, ich t Habe dasselbe auf meiner Maschine gemacht. Was ich getan habe, ist 1. Heruntergeladene XML-Datei auf meinem lokalen Rechner von der URL, die Sie gepostet haben. 2. Verwenden Sie Ihr XML-Parsing-Skript zum Vorbereiten der Struktur aus XML.

Erstaunlicherweise funktionierte es perfekt auf meiner Maschine, obwohl XML Nedelišće Keyword hat. So sehe ich das Problem in der Art des Lesens XML-Datei.

Es wäre einfach zu debuggen, wenn Sie mir sagen können, wie Sie das XML-Formular Google API lesen. Verwenden Sie CURL?

BEARBEITEN --------------------------------------------- -

Hallo 0plus1,

ich eine Hilfsfunktion vorbereitet haben, diese Sonderzeichen zu konvertieren für die es der Lage, für das Parsen html ..

Ich paste den gesamten Code hier. Verwenden Sie folgendes Skript ..

function utf8tohtml($utf8, $encodeTags) 
{ 
    $result = ''; 
    for ($i = 0; $i < strlen($utf8); $i++) 
    { 
     $char = $utf8[$i]; 
     $ascii = ord($char); 
     if ($ascii < 128) 
     { 
      // one-byte character 
      $result .= ($encodeTags) ? htmlentities($char , ENT_QUOTES, 'UTF-8') : $char; 
     } else if ($ascii < 192) 
     { 
      // non-utf8 character or not a start byte 
     } else if ($ascii < 224) 
     { 
      // two-byte character 
      $result .= htmlentities(substr($utf8, $i, 2), ENT_QUOTES, 'UTF-8'); 
      $i++; 
     } else if ($ascii < 240) 
     { 
      // three-byte character 
      $ascii1 = ord($utf8[$i+1]); 
      $ascii2 = ord($utf8[$i+2]); 
      $unicode = (15 & $ascii) * 4096 + 
       (63 & $ascii1) * 64 + 
       (63 & $ascii2); 
      $result .= "&#$unicode;"; 
      $i += 2; 
     } else if ($ascii < 248) 
     { 
      // four-byte character 
      $ascii1 = ord($utf8[$i+1]); 
      $ascii2 = ord($utf8[$i+2]); 
      $ascii3 = ord($utf8[$i+3]); 
      $unicode = (15 & $ascii) * 262144 + 
       (63 & $ascii1) * 4096 + 
       (63 & $ascii2) * 64 + 
       (63 & $ascii3); 
      $result .= "&#$unicode;"; 
      $i += 3; 
     } 
    } 
    return $result; 
} 


$curlHandle = curl_init(); 
$serviceUrl = "http://www.google.com/ig/api?weather=dunjkovec,medimurska,croatia&hl=en"; 
// setup the basic options for the curl 
curl_setopt($curlHandle , CURLOPT_URL, $serviceUrl); 
curl_setopt($curlHandle , CURLOPT_HEADER , 0); 
curl_setopt($curlHandle , CURLOPT_HTTPHEADER , array("Cache-Control: no-cache","Content-type: application/x-www-form-urlencoded;charset=UTF-8")); 
curl_setopt($curlHandle , CURLOPT_FOLLOWLOCATION , true); 
curl_setopt($curlHandle , CURLOPT_RETURNTRANSFER , true); 
curl_setopt($curlHandle , CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)'); 
$data = curl_exec($curlHandle); 
// echo $data; 
$data = utf8tohtml($data , false); 
echo $data; 

$parser = xml_parser_create("UTF-8"); 
xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8"); 
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0); 
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1); 
$ok = xml_parse_into_struct($parser, $data, $values); 
if (!$ok) { 
    $errmsg = sprintf("XML parse error %d '%s' at line %d, column %d (byte index %d)", 
    xml_get_error_code($parser), 
    xml_error_string(xml_get_error_code($parser)), 
    xml_get_current_line_number($parser), 
    xml_get_current_column_number($parser), 
    xml_get_current_byte_index($parser)); 
} 
echo "<pre>"; 
print_r($values); 
echo "</pre>"; 

Hoffe, das wird helfen.

Danke!

Hussain.

+0

Ich habe versucht mit beiden cURL und file_get_contents. Beide gleichen Ergebnisse ... – 0plus1

+0

Ich untersuchte das Problem nach dem Lesen Ihres Beitrags, das ist, was ich Ich denke, das Problem ist hier! – 0plus1

+0

Es funktionierte für mich mit ähnlichen Problemen wie das OP. – sparrow

0

Noch einmal, welche PHP-Version verwenden Sie? xml_parser_create nimmt Kodierung als Parameter, aber nur für die Ausgabe, nicht in einigen Versionen eingegeben. http://www.php.net/manual/en/function.xml-parser-create.php

Sie könnten in Erwägung ziehen, eine leere utf-8-Zeichenfolge zu erstellen und diese dann mit dem von Google abgerufenen XML zu füllen oder die Zeichenfolge explizit in UTF-8 zu konvertieren.

string utf8_encode (string $data) 

Google uns korrekt die Daten informiert ist UTF-8, aber nur in der Kopfzeile, nicht in der eigentlichen XML.

1

Die Content-Type header field in der Antwort gibt den Inhalt an, der mit ISO 8859-1 codiert werden soll (siehe response on Web-Sniffer.net) und nicht UTF-8. Geben Sie entweder ISO-8859-1 als Kodierung an oder lassen Sie diesen Parameter aus und xml_parser_create versucht, die Kodierung zu identifizieren.

+0

Interessant, Firefox sagte mir, es war UTF-8. Ich denke mit diesen Charakteren wird er UTF-8 sowieso brauchen. –

+0

@James Walford: Hm, ich denke, dass die Inhaltscodierung vom User Agent abhängt. Wenn Sie in der Anfrage "Mozilla/5.0" verwenden, erhalten Sie UTF-8. – Gumbo

+0

also könnte das Setzen der Accept-Charset-Anfrage-Header auf UTF-8 beim Aufruf von Google helfen? –

Verwandte Themen