php执行停止simplexml_load_string()错误


php execution stopped simplexml_load_string() error

我有这个php脚本,它从谷歌API加载谷歌天气。

<?php
      //Weather Forecast icon and temperature from google weather API
      $setYourLanguage = "en"; // Possibilities: "en" - english; "ru" - russian; "ka" - georgian;
      //WEATHER, read google XML weather forecast
      $URL = "http://www.google.com/ig/api?weather=".$myCity."&hl=".$setYourLanguage."";
      $dataInISO = file_get_contents($URL);
      $dataInUTF = mb_convert_encoding($dataInISO, "UTF-8", "ISO-8859-2"); //fix Google's API UTF-8 bug
      $xml = simplexml_load_string($dataInUTF); 
      $current = $xml->xpath("/xml_api_reply/weather/current_conditions");
      $iconData = str_replace("/ig/images/weather/", "weather/",  $current[0]->icon['data']);
      $iconData = str_replace(".gif", ".png", $iconData);
?>

但有时页面无法加载,我在apache2日志中出错:

[Thu Aug 23 12:04:16 2012] [error] [client ::1] PHP Warning:  simplexml_load_string(): Entity: line 1: parser error : Start tag expected, '<' not found in /Library/WebServer/Documents/wordpress/wp-content/themes/directorypress/homepage-structure.php on line 23
[Thu Aug 23 12:04:16 2012] [error] [client ::1] PHP Warning:  simplexml_load_string(): Unsupported API in /Library/WebServer/Documents/wordpress/wp-content/themes/directorypress/homepage-structure.php on line 23
[Thu Aug 23 12:04:16 2012] [error] [client ::1] PHP Warning:  simplexml_load_string(): ^ in /Library/WebServer/Documents/wordpress/wp-content/themes/directorypress/homepage-structure.php on line 23
[Thu Aug 23 12:04:16 2012] [error] [client ::1] PHP Fatal error:  Call to a member function xpath() on a non-object in /Library/WebServer/Documents/wordpress/wp-content/themes/directorypress/homepage-structure.php on line 25
[Thu Aug 23 12:05:57 2012] [error] [client ::1] What

你知道为什么会这样吗?我的理论是,它无法正确连接到URL,并以这种方式失败。。。但是为什么页面加载停止了?有什么方法可以避免这个错误吗?并允许页面完全加载?

如果SimpleXml未能加载XML,则变量$xml的值为false,而不是类型为SimpleXMLElement的实例。也就是说,错误消息所说的:

〔Thu Aug 23 12:04:16 2012〕〔error〕〔client::1〕PHP致命错误:在第25行的/Library/WebServer/Documents/wordpress/wp-content/themes/directorypress/homepage-structure.PHP中的非对象上调用成员函数xpath()

因此,在访问对象上的函数之前,您应该对此进行检查。

if ($xml) {
      $current = $xml->xpath("/xml_api_reply/weather/current_conditions");
      $iconData = str_replace("/ig/images/weather/", "weather/",  $current[0]->icon['data']);
      $iconData = str_replace(".gif", ".png", $iconData);
}

然后,即使从Web服务加载XML失败,您的页面也将完全加载。