2013-07-17 3 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

Вы можете попробовать это: http://php.net/manual/en/language.exceptions.php

Кстати, чтобы избежать бросали ошибки на пользователях, это хорошо, чтобы установить некоторые из этих PHP опций поэтому ошибки записываются в апач журнал сервера или отдельный файл, но не показываются пользователю. Это хорошо и с точки зрения безопасности: http://php.net/manual/en/errorfunc.configuration.php

обновления: Я вижу a nice guide для настройки параметров протоколирования ошибок.

0

В соответствии с документацией SimpleXMLElement конструктор генерирует исключение, если файл не может быть проанализирован. Я хотел бы попробовать окружив его примерку улова:

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, но конструктор будет «бросок» ошибка. Обычно бросок останавливает все на своих дорогах, но поскольку вы «поймаете» его, вы явно говорите: «Эй, если есть проблема, верните мне контроль и позвольте мне решить, что с этим делать».

Смежные вопросы