在用SAX解析XML文檔的時候,在XML檔案中如果有中文的話就會抛出“invalid byte 1 of 1-byte UTF-8 sequence”異常,調試是總是找不到問題所在,于是求救于網絡,終于找到問題所在,成功解決了問題,在此謝謝強大的網絡資源。
XML内容實際是以UTF-8編碼的,是以造成了包括中文字元的XML檔案無法正常閱讀,将編碼格式改成“GB2312”後就可以正常解析了。<?xml version="1.0" encoding="GB2312"?>
自己的總結:
1、“org.dom4j.DocumentException: Invalid byte 1 of 1-byte UTF-8 sequence.”異常分析和解決:
分析:
該異常由下面的reader.read(file);語句抛出:
SAXReader reader = new SAXReader();
Document doc = reader.read(file);
産生這個異常的原因是:
所讀的xml檔案實際是GBK或者其他編碼的,而xml内容中卻用<?xml version="1.0" encoding="utf-8"?>指定編碼為utf-8,是以就報異常了!
注釋:參考網上的《Java/J2EE中文問題終極解決之道》一文,編碼問題原因應該是:作業系統編碼為GBK,而xml指定為utf-8,SAXReader使用系統的預設編碼GBK,是以存在需要轉換編碼的問題,也就自然會出現亂碼了!解決:讓檔案編碼和java 操作該檔案的接口的編碼一緻;
解決:
情況一:該xml檔案由dom4j生成;
解決方法:用 org.dom4j.io.XMLWriter xmlWriter = new org.dom4j.io.XMLWriter(
new FileOutputStream(fileName));
代替
xmlWriter = new XMLWriter(new FileWriter(fileName));
,指定編碼為utf-8生成xml檔案;
詳細參考資料1:
Dom4j 編碼問題徹底解決 作者:lonsen
http://www.5inet.net/Develop/Java/036579,Dom4j_BianMaWenDiCheDeJieJue.aspx
情況二:解析從jsp頁面中讀取到的使用者輸入的xml描述内容時,reader.read()抛出異常;
解決方法:
調用read前先把xml内容轉為utf-8編碼:(使用支援編碼格式的函數)
public void validate(FacesContext context, UIComponent component, Object obj)
throws ValidatorException {
String xmldescription = (String) obj;
byte[] bytes =xmldescription.getBytes();
RelationXmlParser.isXmlOK("E://jiangcm//templateXMLSchema.xsd",bytes);
……
}
public static boolean isXmlOK(String xsdFile, byte[] tagetXml) throws SAXException, IOException, DocumentException
{
SAXReader reader = new SAXReader();
……
InputStream in = new ByteArrayInputStream(tagetXml);
InputStreamReader utf8In=new InputStreamReader(in,"utf-8");
……
}
自己的解決:String.getBytes("utf-8")