1. 程式人生 > 程式設計 >DOM解析XML報錯Content is not allowed in prolog解決方案詳解

DOM解析XML報錯Content is not allowed in prolog解決方案詳解

報錯內容為:

Content is not allowed in prolog. Nested exception: Content is not allowed in prolog

網上所述總結來說就是解析內容內包含BOM。這個標記是看不到的,流裡面有這個標記而已。

BOM:Byte Order Mark,中文名位元組順序標記。UCS規範建議在傳輸位元組流前,先傳輸BOM來判斷位元組順序。

其實UTF-8是不需要用BOM來表明位元組順序的,但是可以 用BOM來表明編碼方式。BOM的UTF-8編碼是EF BB BF,所以呢,如果接受者收到EF BB BF開頭的位元組流,就說明它是UTF-8編碼了。

解決辦法:

如果解析的是檔案:

可以用UltraEdit或者EmEditor開啟XML,然後另存為,儲存的時候有選項是以無BOM的UTF-8儲存還是以有BOM的UTF-8儲存。

如果是從遠端請求回來的內容:

那麼你把返回的流New為字串,是看不到BOM的,但是你必須擷取你需要的內容:

if(null != result && !"".equals(result)){ 
  if(result.indexOf("<") != -1 && result.lastIndexOf(">") != -1 && result.lastIndexOf(">") > result.indexOf("<")) 
    result = result.substring(result.indexOf("<"),result.lastIndexOf(">") + 1); 
} 

也有說是DOM4J版本較低引起的,但是我看了一下我是用的版本是1.6.1,所以排除此類可能,但是在實際中我還是建議使用最新穩定版本來進行開發。

更新

今天看日誌,發現我的異常不是因為BOM頭引起的,幸好我也列印了收到的內容,我一看,我去,伺服器在自己處理失敗以後直接返回個 error字串,mian了一下,果然出錯,這坑爹的玩兒。

public static void main(String[] args) throws DocumentException { 
  String str = "error"; 
  Document doc = DocumentHelper.parseText(str); 
  System.out.println(doc.asXML()); 
} 

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。