【问题标题】:Error handling in "simplexml_load_file"“simplexml_load_file”中的错误处理
【发布时间】:2010-12-03 21:19:52
【问题描述】:

我在我的 php.ini 中处理 simplexml_load_file 时遇到问题。我正在尝试解析 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,因为它会给出“Invalid argument provided for foreach()”

或者,如果您认为我还需要处理其他事情,以使其成为永久解决方案,请也告诉我。

【问题讨论】:

    标签: php xml simplexml


    【解决方案1】:

    函数在失败时返回 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...
    }
    

    【讨论】:

    • 谢谢,这可以做到,但我仍然会收到错误“simplexml_load_file($foxs_url_break_news”并且链接已损坏,或者simplexml_load_file无法加载xml。我该如何处理那个。
    • 在函数调用之前放置一个@。我会更新我的答案。
    • 将 @ 放入 else 语句中,并在我的 foreach 循环中给出错误。
    【解决方案2】:

    帮助我解决问题的几件事:

    $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 语句中有整个“@simplexml_load_file($foxs_url_break_news, 'SimpleXMLElement', LIBXML_NOCDATA)”,而不是 $foxs_xml_break_news。我不知道为什么这是有效的,而不是当我的 IF 中的 $foxs_xml_break_news 不起作用时。

    我什至尝试过 if($foxs_xml_break_news === FALSE) 但即使这对我也不起作用。

    【讨论】:

    • 我也遇到了同样的问题
    猜你喜欢
    • 2011-05-16
    • 2017-11-10
    • 2012-07-05
    • 2015-03-26
    • 2014-10-29
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多