xml解析错误:'无效字符'

0pl*_*us1 5 php xml

我正在使用谷歌天气api的小部件.

一切都很好,花花公子,但今天我遇到了一个我无法解决的问题.使用此位置调用时:

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

我收到此错误:

XML parse error 9 'Invalid character' at line 1, column 169 (byte index 199)
Run Code Online (Sandbox Code Playgroud)

我怀疑问题在这里:Nedelišće

代码块是这样的:

$parser = xml_parser_create('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));
}
Run Code Online (Sandbox Code Playgroud)

$ data是xml的内容,$ values是空的.

有人能帮我吗?非常感谢你!

编辑 - - - - - - - - - - - - - - - - -

在阅读了Hussein的帖子后,我发现问题在于文件被检索的方式.

我尝试了file_get_contents和cURL.两者都回报:

这就是产生问题的路线.或者我想!我试过这个html_entity_decode($ data,ENT_NOQUOTES,'UTF-8')并且它无法正常工作,所以我做了一个发现,我无法回显xml的内容,我只能print_r它们并看到结果html源码!世界上任何其他位置都有效,只有这个产生问题...我想哭:-(

编辑2 --------------------------------

对于任何关心的人.我从api中检索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'); 
Run Code Online (Sandbox Code Playgroud)

然后解析xml,它就像一个魅力.我标记了侯赛因的回答,因为它让我走上正轨.

eHu*_*ain 4

读完你的问题后,我在我的机器上尝试了同样的事情。\n我所做的是\n1。从您发布的 URL 将 xml 文件下载到我的本地计算机上。\n2. 使用您的 xml 解析脚本从 XML 准备结构。

\n\n

令人惊讶的是,它在我的机器上运行得很好,尽管 XML 有 Nedeli\xc5\xa1\xc4\x87e 关键字。\n所以,我在读取 XML 文件的方式上看到了问题。

\n\n

如果您能告诉我您读取 xml 表单 google api 的方式,那么调试会很容易。\n您使用 CURL 吗?

\n\n

编辑 - - - - - - - - - - - - - - - - - - - - - - - -

\n\n

嗨0plus1,

\n\n

我准备了一个辅助函数来将这些特殊字符转换为 html,以便能够解析。

\n\n

我在这里粘贴整个代码。使用以下脚本..

\n\n
function utf8tohtml($utf8, $encodeTags)\n{\n    $result = \'\';\n    for ($i = 0; $i < strlen($utf8); $i++)\n    {\n        $char = $utf8[$i];\n        $ascii = ord($char);\n        if ($ascii < 128)\n        {\n            // one-byte character\n            $result .= ($encodeTags) ? htmlentities($char , ENT_QUOTES, \'UTF-8\') : $char;\n        } else if ($ascii < 192)\n        {\n            // non-utf8 character or not a start byte\n        } else if ($ascii < 224)\n        {\n            // two-byte character\n            $result .= htmlentities(substr($utf8, $i, 2), ENT_QUOTES, \'UTF-8\');\n            $i++;\n        } else if ($ascii < 240)\n        {\n            // three-byte character\n            $ascii1 = ord($utf8[$i+1]);\n            $ascii2 = ord($utf8[$i+2]);\n            $unicode = (15 & $ascii) * 4096 +\n                (63 & $ascii1) * 64 +\n                (63 & $ascii2);\n            $result .= "&#$unicode;";\n            $i += 2;\n        } else if ($ascii < 248)\n        {\n            // four-byte character\n            $ascii1 = ord($utf8[$i+1]);\n            $ascii2 = ord($utf8[$i+2]);\n            $ascii3 = ord($utf8[$i+3]);\n            $unicode = (15 & $ascii) * 262144 +\n                (63 & $ascii1) * 4096 +\n                (63 & $ascii2) * 64 +\n                (63 & $ascii3);\n            $result .= "&#$unicode;";\n            $i += 3;\n        }\n    }\n    return $result;\n}\n\n\n$curlHandle = curl_init();\n$serviceUrl = "http://www.google.com/ig/api?weather=dunjkovec,medimurska,croatia&hl=en";\n// setup the basic options for the curl\ncurl_setopt($curlHandle , CURLOPT_URL, $serviceUrl);\ncurl_setopt($curlHandle , CURLOPT_HEADER , 0);\ncurl_setopt($curlHandle , CURLOPT_HTTPHEADER , array("Cache-Control: no-cache","Content-type: application/x-www-form-urlencoded;charset=UTF-8"));\ncurl_setopt($curlHandle , CURLOPT_FOLLOWLOCATION , true);\ncurl_setopt($curlHandle , CURLOPT_RETURNTRANSFER , true);\ncurl_setopt($curlHandle , CURLOPT_USERAGENT, \'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)\');\n$data = curl_exec($curlHandle);\n// echo $data;\n$data = utf8tohtml($data , false);\necho $data;\n\n$parser = xml_parser_create("UTF-8");\nxml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8");\nxml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);\nxml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);\n$ok = xml_parse_into_struct($parser, $data, $values);\nif (!$ok) {\n    $errmsg = sprintf("XML parse error %d \'%s\' at line %d, column %d (byte index %d)",\n    xml_get_error_code($parser),\n    xml_error_string(xml_get_error_code($parser)),\n    xml_get_current_line_number($parser),\n    xml_get_current_column_number($parser),\n    xml_get_current_byte_index($parser));\n}\necho "<pre>";\nprint_r($values);\necho "</pre>";\n
Run Code Online (Sandbox Code Playgroud)\n\n

希望这会有所帮助。

\n\n

谢谢!

\n\n

侯赛因。

\n