轉(zhuǎn)載自:http://askcuix.appspot.com/2011/02/17/content-is-not-allowed-in-prolog.html

     最近在做一些批處理XML的項(xiàng)目,通過Spring Batch讀取XML,然后將數(shù)據(jù)存入數(shù)據(jù)庫。XML是客戶方通過AS400的技術(shù)將數(shù)據(jù)讀出并寫入到文件的,我不了解AS400處理這類問題是不是很麻煩,每次XML需要做些變動(dòng)的時(shí)候,客戶總是表現(xiàn)的很為難,并且都是很久才能給到新的XML,還總是有這樣那樣的問題,甚至都不是一個(gè)有效的XML。這兩天總算是改的差不多了,但遇到了好幾次這樣的exception: org.xml.sax.SAXParseException: Content is not allowed in prolog。以前也接觸過不少XML,可是這種問題還真是沒遇到過。

      檢查XML發(fā)現(xiàn)有一些轉(zhuǎn)義字符沒有做處理,&沒有寫成&amp;,這是出現(xiàn)這種錯(cuò)誤的一種可能性,在XML規(guī)范中,明確的說明&和<需要做轉(zhuǎn)義,不能直接出現(xiàn)在XML文檔中,否則就不是一個(gè)有效的XML。修正了這個(gè)問題,一個(gè)XML處理成功了。

      在執(zhí)行另外一個(gè)XML文件時(shí),又遇到了這個(gè)問題,將轉(zhuǎn)義字符的問題修正后,依然存在該錯(cuò)誤,經(jīng)過google的幫助,發(fā)現(xiàn)應(yīng)該是文件編碼的問題。檢查該文件,是UTF-8編碼,應(yīng)該沒問題的,結(jié)果問題就出在這個(gè)文件用UltraEdit編輯過,UltraEdit等一些編輯器會(huì)在無BOM頭的UTF-8文件中加入BOM信息,但是XML解析器不認(rèn)BOM。查看該文件的二進(jìn)制內(nèi)容,會(huì)發(fā)現(xiàn)在文件頭有EF BB BF,在對(duì)應(yīng)的字符串顯示中可以看到它是在<?xml version="1.0" encoding="UTF-8"?>前的一個(gè)亂碼字符,問題就出在了這個(gè)字符上。我平時(shí)是用NotePad++,在狀態(tài)欄的文件編碼中可以看到這個(gè)文件是UTF-8編碼,我在encoding菜單中選擇UTF-8 without BOM,這時(shí)文件編碼就變成了ANSI-UTF8,同時(shí)EF BB BF也消失了,再執(zhí)行這個(gè)文件就正確了。這個(gè)encoding選項(xiàng)在高版本的UltraEdit中也有,但是舊版本中是沒有的。

      BOM - byte order mark,就是字節(jié)序標(biāo)記,UTF-8不需要BOM來表明字節(jié)順序,但可以用BOM來表明編碼方式, 如果接受者收到以EF BB BF開頭的字節(jié)流,就知道這是UTF-8編碼了,Windows就是使用BOM來標(biāo)記文本文件的編碼方式的。對(duì)于BOM我沒有深究,有興趣的話可以參考:http://www.unicode.org/faq/utf_bom.html#bom1。

      對(duì)于這個(gè)錯(cuò)誤,還有一種可能性,就是有標(biāo)簽使用了中文輸入法,比如<?xml version="1.0" encoding="UTF-8"?>寫成了<xml version="1.0" encoding="UTF-8"?>,注意這兩個(gè)問號(hào)都用了中文輸入法。

      這是我已發(fā)現(xiàn)的出現(xiàn)這種錯(cuò)誤的三個(gè)可能性,出現(xiàn)這種錯(cuò)誤后,應(yīng)檢查文件編碼,除此以外應(yīng)該就是一些字符輸入錯(cuò)誤的問題了,有問題的朋友可以從這兩個(gè)方面著手。據(jù)說新版本的JDom解決了這個(gè)問題,看來并不是所有的解析器都不認(rèn)BOM,有時(shí)間的話還是要研究研究。