2013-07-17 129 views
1

我非常感謝您對此的幫助。 基本上,我有一個PHP網頁,用戶在其中選擇一個城市名稱(通過其代碼),然後將其發送到腳本,該腳本在數據庫中查找城市,獲取與其關聯的XML文件,其中包含其當前天氣,然後顯示它。 除非用戶選擇一個不存在的代碼,否則它一切正常。那麼,什麼情況是,我得到的消息: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

根據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對象,但構造函數將「扔」的錯誤。通常情況下,投擲會阻止一切事物的發展,但是由於你在「捕捉」它,所以你明確地說:「嘿,如果有問題,將控制權交還給我,讓我決定如何處理」。