2012-01-08 61 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