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

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

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

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

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

      對于這個錯誤,還有一種可能性,就是有標簽使用了中文輸入法,比如<?xml version="1.0" encoding="UTF-8"?>寫成了<xml version="1.0" encoding="UTF-8">,注意這兩個問號都用了中文輸入法。

      這是我已發現的出現這種錯誤的三個可能性,出現這種錯誤后,應檢查文件編碼,除此以外應該就是一些字符輸入錯誤的問題了,有問題的朋友可以從這兩個方面著手。據說新版本的JDom解決了這個問題,看來并不是所有的解析器都不認BOM,有時間的話還是要研究研究。