Обработка ошибок в simplexml_load_file

У меня возникла проблема с обработкой ошибки, когда simplexml_load_file в моем файле php. Я пытаюсь проанализировать xml fox_sports и сохранить дату в моей базе данных. Мой код выглядит следующим образом:

$foxs_url_breaking_news = 'http://feeds.news.com.au/public/rss/2.0/fs_breaking_news_13.xml';
    $foxs_xml_breaking_news = simplexml_load_file($foxs_url_breaking_news, 'SimpleXMLElement', LIBXML_NOCDATA);
    foreach($foxs_xml_breaking_news->channel[0]->item as $item)
    {   
        $date = date('Y-m-d H:i:s',strtotime($item->pubDate));
        $news->insert(array('source' => 'foxsports',
                            'headline' => addslashes($item->title),
                            'timestamp' => $date,
                            'description' => addslashes($item->description),
                            'category' => 'Breaking News',
                            'link' => addslashes($item->link)));            
    }

Код, который у меня есть, отлично работает. Но проблема в том, что я хочу сделать это долгосрочным решением. Поэтому мне нужна обработка ошибок для: 1. Если ссылка на xml больше недоступна. 2. Если simplexml_load_file не может загрузить xml файл по ссылке. 3. Если simplexml_load_file не может загрузить xml, то foreach также не должен выполняться, так как он выдаст «Недопустимый аргумент, указанный для foreach ()».

Или, если вы думаете, что мне нужно позаботиться о чем-то еще, чтобы сделать это постоянным решением, дайте мне знать и об этом.


person Zeeshan Rang    schedule 03.12.2010    source источник


Ответы (2)


В случае неудачи функция возвращает false, поэтому перед циклом проверьте, не является ли $foxs_xml_breaking_news ложным.

$foxs_xml_breaking_news = @simplexml_load_file($foxs_url_breaking_news, 'SimpleXMLElement', LIBXML_NOCDATA);
if($foxs_xml_breaking_new === false)
{
    //cannot fetch file
}
else
{
     // foreach loop...
}
person Tim Cooper    schedule 03.12.2010
comment
Спасибо, это можно сделать, но я все равно получаю ошибку simplexml_load_file($foxs_url_breaking_news и ссылка не работает, или simplexml_load_file не может загрузить xml. Как я могу позаботиться об этом. - person Zeeshan Rang; 04.12.2010
comment
Поместите @ перед вызовом функции. Я обновлю свой ответ. - person Tim Cooper; 04.12.2010
comment
Размещение @ идет в операторе else для меня и дает ошибку в моем цикле foreach. - person Zeeshan Rang; 04.12.2010

Пара вещей, которые помогли мне решить мою проблему:

$foxs_url_breaking_news = 'http://feeds.news.com.au/public/rss/2.0/fs_breaking_news_13.xml';
$foxs_xml_breaking_news = @simplexml_load_file($foxs_url_breaking_news, 'SimpleXMLElement', LIBXML_NOCDATA);
if(@simplexml_load_file($foxs_url_breaking_news, 'SimpleXMLElement', LIBXML_NOCDATA))
{   
    foreach($foxs_xml_breaking_news->channel[0]->item as $item)
    {   
        $date = date('Y-m-d H:i:s',strtotime($item->pubDate));
        $news->insert(array('source' => 'foxsports',
                            'headline' => addslashes($item->title),
                            'timestamp' => $date,
                            'description' => addslashes($item->description),
                            'category' => 'Breaking News',
                            'link' => addslashes($item->link)));            
    }
}

Итак: я использовал @ перед simplexml_load_file, чтобы избежать сообщения об ошибке в случае, если он не может загрузить файл. И второе: вместо этого у меня есть весь "@simplexml_load_file($foxs_url_breaking_news, 'SimpleXMLElement', LIBXML_NOCDATA)" в моем выражении IF из $foxs_xml_breaking_news. Я понятия не имею, почему это работает, а не тогда, когда у меня $foxs_xml_breaking_news в моем IF не работает.

Я даже пробовал if($foxs_xml_breaking_news === FALSE), но даже это у меня не сработало.

person Zeeshan Rang    schedule 03.12.2010
comment
у меня такая же проблема - person illinois; 15.09.2015