程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> 關於xml加載提示: Error on line 1 of document : 前言中不允許有內容,xmldocument

關於xml加載提示: Error on line 1 of document : 前言中不允許有內容,xmldocument

編輯:JAVA綜合教程

關於xml加載提示: Error on line 1 of document : 前言中不允許有內容,xmldocument


我是在java中做的相關測試, 首先粘貼下報錯:

讀取xml配置文件:xmls\property.xml
org.dom4j.DocumentException: Error on line 1 of document  : 前言中不允許有內容。 Nested exception: 前言中不允許有內容。
    at org.dom4j.io.SAXReader.read(SAXReader.java:482)
    at org.dom4j.io.SAXReader.read(SAXReader.java:365)
    at com.core.util.XmlTemplateUtil.loadXmlTemplateByIO(XmlTemplateUtil.java:93)
    at com.game.impl.TemplateDataManager2.initFromDisk(TemplateDataManager2.java:61)
    at start.Main.<init>(Main.java:55)
    at start.Main.main(Main.java:128)
Nested exception: 
org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; 前言中不允許有內容。
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
    at org.dom4j.io.SAXReader.read(SAXReader.java:465)
    at org.dom4j.io.SAXReader.read(SAXReader.java:365)
    at com.core.util.XmlTemplateUtil.loadXmlTemplateByIO(XmlTemplateUtil.java:93)
    at com.game.impl.TemplateDataManager2.initFromDisk(TemplateDataManager2.java:61)
    at start.Main.<init>(Main.java:55)
    at start.Main.main(Main.java:128)

這個提示直白點就是說xml文件中<在你想象的文本內容>的開頭,還有別的內容. 網上有很多類似問題的解決方案也是與此相關的.但是描述並不准確. 可能他真的是在xml文件的開頭誤寫了一個什麼東西, 在他刪除之後,他的這個問題隨之解決. 於是熱心腸上網回復了遇見同樣問題的人. 但是你可能翻來覆去檢查了N次, 並沒有看到有什麼多余的字符. 可能你就轉向選擇了另外一種解決方案:更換編碼格式為ANSI. 

到這裡, 引用下別人介紹過的相關知識和解決方法<原鏈接地址:https://zhidao.baidu.com/question/537175301.html?fr=iks&word=utf-8%CE%DEbom&ie=gbk>:

BOM——Byte Order Mark,就是字節序標記
在UCS 編碼中有一個叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的編碼是FEFF。而FFFE在UCS中是不存在的字符,所以不應該出現在實際傳輸中。UCS規范建議我們在傳輸字節流前,
先傳輸字符"ZERO WIDTH NO-BREAK SPACE"。這樣如果接收者收到FEFF,就表明這個字節流是Big-Endian的;如果收到FFFE,就表明這個字節流是Little-Endian的。
因此字符"ZERO WIDTH NO-BREAK SPACE"又被稱作BOM。

UTF-8不需要BOM來表明字節順序,但可以用BOM來表明編碼方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8編碼是EF BB BF。所以如果接收者收到以EF BB BF開頭的字節流,就知道這是UTF-8編碼了。 UTF-8編碼的文件中,BOM占三個字節。如果用記事本把一個文本文件另存為UTF-8編碼方式的話,用UE打開這個文件,切換到十六進制編輯狀態就可以看到開頭的FFFE了。這是個標識UTF-8編碼文件的好辦法,軟件通過BOM來識別這個文件是否是UTF-8編碼,很多軟件還要求讀入的文件必須帶BOM。可是,還是有很多軟件不能識別BOM。

在Firefox早期的版本裡,擴展是不能有BOM的,不過Firefox 1.5以後的版本已經開始支持BOM了。現在又發現,PHP也不支持BOM。PHP在設計時就沒有考慮BOM的問題,也就是說他不會忽略UTF-8編碼的文件開頭BOM的那三個字符。 由於必須在在Bo-Blog的wiki看到,同樣使用PHP的Bo-Blog也一樣受到BOM的困擾。其中有提到另一個麻煩:“受COOKIE送出機制的限制,在這些文件開頭已經有BOM的文件中,COOKIE無法送出(因為在COOKIE送出前PHP已經送出了文件頭),所以登入和登出功能失效。一切依賴COOKIE、SESSION實現的功能全部無效。”這個應該就是Wordpress後台出現空白頁面的原因了,因為任何一個被執行的文件包含了BOM,這三個字符都將被送出,導致依賴cookies和session的功能失效。

解決的辦法嘛,如果只包含英文字符(或者說ASCII編碼內的字符),就把文件存成ASCII碼方式吧。用UE等編輯器的話,點文件->轉換->UTF-8轉ASCII,或者在另存為裡選擇ASCII編碼。如果是DOS格式的行尾符,可以用記事本打開,點另存為,選ASCII編碼。如果包含中文字符的話,可以用UE的另存為功能,選擇“UTF-8 無 BOM”即可。

  看到這裡你就明白了, 你選擇的編碼格式就是這種帶著BOM標記的編碼格式. 在很多文本編輯器裡, 另存為utf-8時,你可能沒注意到他是存的是帶BOM標記的utf-8還是不帶BOM標記的utf-8. 所以,不是一定要更改成為ANSI格式,"utf-8 無BOM"類型也是可以解決問題的.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved