我非常感谢你对此的帮助。 基本上,我有一个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
答案 0 :(得分:0)
你可以试试这个: http://php.net/manual/en/language.exceptions.php
为避免向用户抛出错误,最好设置一些这些php选项,以便将错误记录到apache服务器日志或单独的文件中,但不会向用户显示。从安全角度来看,这也很好: http://php.net/manual/en/errorfunc.configuration.php
更新:我看到a nice guide用于设置错误记录选项。
答案 1 :(得分: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对象,但构造函数将“抛出”一个错误。通常情况下,投掷会阻止所有内容,但是由于你正在“抓住”它,你明确地说,“嘿,如果有问题,请将控制权交还给我,让我决定该怎么做”。 / p>