1

非常感谢您对此提供的帮助。基本上,我有一个 PHP 网页,用户在其中选择一个城市名称(通过其代码),然后将其发送到一个脚本,该脚本在数据库中找到该城市,获取与其关联的 XML 文件,其中包含其当前天气, 然后显示。除非用户选择不存在的代码,否则一切正常。然后发生的是我收到消息:

Warning: SimpleXMLElement::__construct() [simplexmlelement.--construct]: Entity: line 1: parser error : Start tag expected, '<' not found in ...

这样做的主要问题是,它会停止所有加载,因此不仅用户会看到这一点,而且页面的其余部分(包括 HTML 和所有内容)都没有加载。

我想要进行某种检查,以防找不到文件的结构错误,只需回显诸如“错误,未找到城市”之类的消息并跳过脚本的其余部分,但加载其余部分网页,其HTML等。

我在互联网上找到了一些解决方案,但我无法成功实施。

加载实际 xml 的代码如下所示:

public function __construct($query, $units = 'imperial', $lang = 'en', $appid = ''){

$xml = new SimpleXMLElement(OpenWeatherMap::getRawData($query, $units, $lang, $appid, 'xml'));

$this->city = new _City($xml->city['id'], 
$xml->city['name'], 
$xml->city->coord['lon'], 
$xml->city->coord['lat'], 
$xml->city->country);

etc.

如果没有找到城市,而不是 XML,程序会得到这个:

http://api.openweathermap.org/data/2.5/weather?id=123456

如果找到它,它会得到这个:

http://api.openweathermap.org/data/2.5/weather?q=London&mode=xml

4

2 回答 2

0

根据 SimpleXMLElement 的文档,如果无法解析文件,构造函数将抛出异常。我会尝试将其包装在 try-catch 中:

try {
  $xml = new SimpleXMLElement(...);
  // The xml loaded, so display the proper information.
} catch (Exception $e) {
  // If it gets here, the xml could not load, so print your 'city not found' message and continue loading the page.
}

发生的情况是,它将尝试构造一个新的 SimpleXMLElement 对象,但构造函数将“抛出”一个错误。通常情况下,投掷会停止一切,但由于您正在“捕捉”它,因此您明确地说,“嘿,如果有问题,请将控制权交还给我,让我决定如何处理它”。

于 2013-07-17T21:00:24.967 回答
0

你可以试试这个: http: //php.net/manual/en/language.exceptions.php

顺便说一句,为了避免向用户抛出错误,最好设置其中一些 php 选项,以便将错误记录到 apache 服务器日志或单独的文件中,但不会向用户显示。从安全的角度来看,这也很好:http: //php.net/manual/en/errorfunc.configuration.php

更新:我看到了一个很好的设置错误日志选项的指南。

于 2013-07-17T20:58:55.393 回答