2011-10-14 44 views
4

SimpleXML的失敗,出現以下錯誤信息:如何處理與SimpleXML的無效的Unicode

simplexml_load_file(): fooo.xml:299108: parser error : Char 0xFFFE out of allowed range 

從我的理解,該投訴是關於一個無效的Unicode字符。 299108行沒有「FFFE」,但它包含「EFBFBE」。

有沒有辦法在simplexml中處理這種類型的錯誤?

+0

我有一個忽略無效字符的函數。我可以張貼給你,如果你需要它...但它有點冗長的一個..... – Karthik

+0

http://stackoverflow.com/questions/3466035/how-to-skip-invalid-characters-in-xml-文件使用PHP – Mob

回答

18

我遇到了很多傳入的用戶數據,我研究了很多方法來解決它。有許多方法可以將輸入數據正確地編碼爲UTF-8,而不需要經常導致這些問題的高階(或其他)unicode值。

但是,消毒解決方案的問題在於它們會更​​改數據,如果您只想成爲中間人,您仍然希望輸出包含這些值。唯一的非破壞性的方式,我可以拿出來獲得一個SimpleXMLElement可靠不會失敗,就是要做到這一點無可否認雙工作的解決方案:

libxml_use_internal_errors(true); 
    $dom = new DOMDocument("1.0", "UTF-8"); 
    $dom->strictErrorChecking = false; 
    $dom->validateOnParse = false; 
    $dom->recover = true; 
    $dom->loadXML($xmlData); 
    $xml = simplexml_import_dom($dom); 

    libxml_clear_errors(); 
    libxml_use_internal_errors(false); 

的訣竅是在PHP的文件中尋找DOM文檔的屬性,注意那些讓你設置解析行爲的額外變量。這種方法對我來說毫無例外,在所有用於使SimpleXMLElement失敗的xml輸入中都會出現字符範圍問題。

我唯一的猜測是爲什麼它的工作原理是SimpleXMLElement在初始化時執行嚴格的檢查,但在從現有的DOMDocument進行初始化時沒有執行。

該方法允許後續的asXML()調用,而不會失敗。

+0

醜陋,但很難與結果爭論。謝謝:) – aland

+0

謝謝。不是最優雅的解決方案,但它肯定是工作! – Garry

+0

這確實救了我! –