2012-01-08 85 views
1

跳过电流回路,如果错误

foreach($users as $user){ 
      $doc = new DOMDocument(); 
      $doc->loadXml(file_get_contents($user["syncUrl"])); 
} 

如果在$用户[“syncUrl”] URL的内容,这样做的的loadXML()返回错误(如果它不能读取)我希望它继续下去;并且不读取循环中的其余部分,直到下一个循环(下一个$ user)。

现在它正在崩溃,并输出它由于格式错误而无法读取。但我希望它能跳过这一点,然后继续。

我怎样才能做到这一点?

回答

1

呵呵,你有它在你的问题:continue;是跳过循环的剩余部分,并开始下一次迭代的命令。在$ doc-> loadXML上进行错误检查,如果没有成功加载,则返回continue;

所以:

foreach($users as $user) 
{ 
    $doc = new DOMDocument(); 
    $loaded = $doc->loadXml(file_get_contents($user["syncUrl"])); //Should return false on failure, true on success 
    if($loaded === false) 
    { 
     continue; 
    } 
    //Do other stuff here if successfully loaded. 
} 

也可能是明智的使用DOMDocument::validate()验证(从DTD)格式和continue如果无效。您还可以使用DOMDocument::schemaValidateSource()来提供源架构,并使用DOMDocument::schemaValidate()来验证该架构的格式。你也可以这样做是为了让它在负载验证:

$doc = new DOMDocument(); 
$doc->validateOnParse = true; 
$doc->loadXML('etc'); 

这可能会需要有加载函数返回false,如果该文件的东西居然有。

0

尝试在$doc->loadXml调用前放一个@,看看是否有效。

+0

它的工作原理,但我想跳过休息,因为现在其他错误,因为$文档的显示 – Karem 2012-01-08 01:04:48

+0

得到什么的' - > loadXml'函数返回,看看它是否是'FALSE',就像凤凰在他的回答中说。 – 2012-01-08 01:11:54

0

使用错误抑制操作,@

foreach($users as $user) { 
    $doc = new DOMDocument(); 
    @$doc->loadXml(file_get_contents($user["syncUrl"])); 
}
0

使用try和catch块?

foreach($users as $user){ 
    try{ 
     $doc = new DOMDocument(); 
     $doc->loadXml(file_get_contents($user["syncUrl"])); 
    } 
    catch(Exception $e){ 
     continue; 
    } 
    //Rest of the code.. 
} 
+0

你不希望'try'中的'$ doc = new DOMDocument();' – 2012-01-08 01:11:57