2011-08-16 126 views
9

我從服務器獲取XML文件,有時我得到一個非有效的XML文件的DOMDocument XML的警告,因爲這樣我得到一個警告:避免在PHP

Warning: DOMDocument::load() [domdocument.load]: Start tag expected, '<' not found in 

哪有我發現這個警告並刪除了這個文件?

+0

[try and catch a warning]的可能重複(http://stackoverflow.com/questions/1241728/try-and-catch-a-warning)(更廣泛的答案) –

回答

34

你有兩種選擇。請在您的load()調用中使用@差錯控制操作員,例如@$dom->load(),由於它將display_errors的值全局更改爲off,執行該函數並將其重新設置爲on,因此速度稍慢。

另一種選擇,這是我個人比較喜歡(我討厭@操作,我無法忍受看到它在我的代碼)是挽救libxml_use_internal_errors舊值,使用libxml_use_internal_errors(TRUE)啓用它,調用函數,明確錯誤緩衝並恢復舊值。下面是我的代碼片段,做的是:

<?php 
$previous_value = libxml_use_internal_errors(TRUE); 
$doc->loadHTML((string)$e->response->getBody()); 
libxml_clear_errors(); 
libxml_use_internal_errors($previous_value); 

我不能解答發表評論,所以我會在這裏寫:

  • 邁克爾的解決方案,不那麼嚴格,但它仍然會發出警告,對一些錯誤:
 
[email protected]:~$ php -r '$dom=new DOMDocument; $dom->strictErrorChecking = FALSE ; $dom->loadHTML("<xy></zx>");' 
PHP Warning: DOMDocument::loadHTML(): Tag xy invalid in Entity, line: 1 in Command line code on line 1 
  • 不這樣做弗蘭維羅納建議 - 禁止全局誤差不到原始婷是你永遠不應該做的事情。在生產中,設置自己的錯誤處理程序並向用戶顯示更漂亮的消息,並確保將錯誤記錄在某處 - 但不要完全禁用它。將error_reporting設置爲0將導致PHP禁用錯誤日誌記錄。
  • Xeon06解決方案存在問題,因爲您正在爲特定的一段代碼生成整個腳本錯誤處理程序。使用你自己的錯誤處理程序,簡單地忽略錯誤會導致與Fran的解決方案相同的問題。
2

關閉嚴格的錯誤檢查:

$dom = new DOMDocument(); 
$dom->strictErrorChecking = FALSE ; 

$dom->load('/path/to/file.xml'); 
if (!$dom->validate()) { 
    // Invalid XML! 
} 
+0

我怎麼知道天氣的XML有效或沒有?如果我收到此警告,我想刪除該文件並再次下載... –

+0

@iUngi請參見上面的'DOMDocument :: validate()' –

3

使用set_error_handler

set_error_handler("yourHandler", E_WARNING); 
+2

以上的其他部分,並在驗證XML文件後使用restore_error_handler()。 –

+0

的確,感謝編輯,我習慣寫JS功能:) –