2009-05-04 101 views
1

我有一個PHP腳本試圖解析一個巨大的XML文件。爲此,我使用XMLReader庫。在解析期間,我有這種編碼錯誤:XMLReader編碼錯誤

輸入不正確UTF-8,指示編碼!字節:0xA0 0x32 0x36 0x30

我想知道他們是否是一種跳過記錄與壞字符的方式。

謝謝!

回答

8

首先,確保您的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); 
+1

我試着打電話給libxml_use_internal_errors(真)函數處理我的XML文件之前,並添加 「LIBXML_NOERROR | LIBXML_NOWARNING」 面具的XMLReader ::打開()。這非常有幫助,但是當發現編碼錯誤時解析仍然停止。你知道他們是否有辦法告訴libxml在發現錯誤時繼續解析。 – 2009-05-04 12:13:49

+0

關於評論的編輯答案。 – 2009-05-04 12:40:34

0

如果您的XML文件結構非常簡單,您可以「預過濾」它以擺脫(甚至更好,更正確)錯誤的記錄。

通過記錄讀取記錄並寫出過濾的xml文件,然後處理過濾的文件。

2

我會聽聽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'。

0
 
$xml = file_get_contents('myxml.xml'); 
$xml = preg_replace('/[\x0-\x1f\x7f-\x9f]/u', ' ', $xml); 
//parse $xml below