我有一個PHP腳本試圖解析一個巨大的XML文件。爲此,我使用XMLReader庫。在解析期間,我有這種編碼錯誤:XMLReader編碼錯誤
輸入不正確UTF-8,指示編碼!字節:0xA0 0x32 0x36 0x30
我想知道他們是否是一種跳過記錄與壞字符的方式。
謝謝!
我有一個PHP腳本試圖解析一個巨大的XML文件。爲此,我使用XMLReader庫。在解析期間,我有這種編碼錯誤:XMLReader編碼錯誤
輸入不正確UTF-8,指示編碼!字節:0xA0 0x32 0x36 0x30
我想知道他們是否是一種跳過記錄與壞字符的方式。
謝謝!
首先,確保您的XML文件確實是UTF-8編碼的。如果沒有指定編碼作爲XMLReader::open()
的第二個參數。
如果編碼錯誤是由於一個UTF-8文檔中的實際格式錯誤字節序列,並且如果你使用PHP> 5.2.0你可以通過LIBXML_NOERROR
和/或(取決於誤差等級)LIBXML_NOWARNING
作爲一個位掩碼到XMLReader::open()
第三個參數:
$xml = new XMLReader();
$xml->open('myxml.xml', null, LIBXML_NOERROR | LIBXML_NOWARNING);
如果your're使用PHP> 5.1.0你可以調整libXML
錯誤處理。
// enable user error handling
libxml_use_internal_errors(true);
/* ... do your XML processing ... */
$errors = libxml_get_errors();
foreach ($errors as $error) {
// handle errors here
}
libxml_clear_errors();
其實我不知道,如果前兩種解決方法實際上允許XMLReader
繼續閱讀在一個錯誤的情況下,或者如果他們只取消錯誤輸出。但值得一試。
響應評價:
libXML
定義XML_PARSE_RECOVER
(1),但是EXT/libxml的不公開該常數作爲PHP恆定。也許可以將整數值1
傳遞給$options
參數。
$xml = new XMLReader();
$xml->open('myxml.xml', null, LIBXML_NOERROR | LIBXML_NOWARNING | 1);
如果您的XML文件結構非常簡單,您可以「預過濾」它以擺脫(甚至更好,更正確)錯誤的記錄。
通過記錄讀取記錄並寫出過濾的xml文件,然後處理過濾的文件。
我會聽聽XMLReader告訴你什麼。請記住,許多編碼都是ASCII的超集,因此(例如)UTF-8和ISO-8859-1與前128個編碼點的ASCII碼相同。很可能您的文件實際上編碼爲ISO-8859-1,但幾乎所有字符都來自該字符集的較低的ASCII一半。在這種情況下,錯誤將是您的錯誤,因爲它允許它使用XML的默認編碼UTF-8。
在ISO-8859-1中,字節序列0xA0 0x32 0x36 0x30
是完全有效的:一個非中斷空間,後跟'2','6','0'。
$xml = file_get_contents('myxml.xml'); $xml = preg_replace('/[\x0-\x1f\x7f-\x9f]/u', ' ', $xml); //parse $xml below
我試着打電話給libxml_use_internal_errors(真)函數處理我的XML文件之前,並添加 「LIBXML_NOERROR | LIBXML_NOWARNING」 面具的XMLReader ::打開()。這非常有幫助,但是當發現編碼錯誤時解析仍然停止。你知道他們是否有辦法告訴libxml在發現錯誤時繼續解析。 – 2009-05-04 12:13:49
關於評論的編輯答案。 – 2009-05-04 12:40:34