Обработка ошибок в "simplexml_load_file" - PullRequest
2 голосов
/ 04 декабря 2010

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

$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 ()»

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

Ответы [ 2 ]

2 голосов
/ 04 декабря 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, чтобы избежать сообщения об ошибке в случае, если он не может загрузить файл И второе: яв моем операторе IF вместо «foxs_xml_breaking_news» есть целый «@simplexml_load_file ($ foxs_url_breaking_news,« SimpleXMLElement », LIBXML_NOCDATA)».У меня нет идеи, почему это работает, а не когда у меня не работает $ foxs_xml_breaking_news, если мой IF не работает.

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

2 голосов
/ 04 декабря 2010

Функция возвращает false при сбое, поэтому перед циклом проверьте, является ли $foxs_xml_breaking_news false.

$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...
}
...