問題的根源是: java
The cause of this is a file that is not UTF-8 is being parsed as UTF-8. It is likely that the parser is encountering a byte value in the range
FE
-FF
. These values are invalid in the UTF-8 encoding.apache
說簡單點,當你解析別人的xml格式出現這個錯誤可能就是別人在生成xml時沒有保存爲utf-8的字符編碼格式。 dom
在中文版的window下java的默認的編碼爲GBK,也就是所雖然咱們標識了要將xml保存爲utf-8格式但實際上文件是以GBK格式來保存的,因此這也就是爲何可以咱們使用GBK、GB2312編碼來生成xml文件能正確的被解析,而以UTF-8格式生成的文件不能被xml解析器所解析的緣由。 this
xml解析時遇到的編碼異常:編碼
org.dom4j.DocumentException: Invalid byte 1 of 1-byte UTF-8 sequence. Nested exception: Invalid byte 1 of 1-byte UTF-8 sequence. at org.dom4j.io.SAXReader.read(SAXReader.java:484) at org.dom4j.io.SAXReader.read(SAXReader.java:321) at com.dataoperate.PaseXml.pXml(PaseXml.java:28) at com.dataoperate.JdbcOp.insertDb(JdbcOp.java:30) at com.dataoperate.JdbcOp.main(JdbcOp.java:89) Nested exception: com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 1 of 1-byte UTF-8 sequence. at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(UTF8Reader.java:684) at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(UTF8Reader.java:554) at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEntityScanner.java:1742) at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.peekChar(XMLEntityScanner.java:487) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2687) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648) at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737) at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205) at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522) at org.dom4j.io.SAXReader.read(SAXReader.java:465) at org.dom4j.io.SAXReader.read(SAXReader.java:321) at com.dataoperate.PaseXml.pXml(PaseXml.java:28) at com.dataoperate.JdbcOp.insertDb(JdbcOp.java:30) at com.dataoperate.JdbcOp.main(JdbcOp.java:89) Nested exception: com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 1 of 1-byte UTF-8 sequence. at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(UTF8Reader.java:684) at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(UTF8Reader.java:554) at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEntityScanner.java:1742) at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.peekChar(XMLEntityScanner.java:487) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2687) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648) at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737) at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205) at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522) at org.dom4j.io.SAXReader.read(SAXReader.java:465) at org.dom4j.io.SAXReader.read(SAXReader.java:321) at com.dataoperate.PaseXml.pXml(PaseXml.java:28) at com.dataoperate.JdbcOp.insertDb(JdbcOp.java:30) at com.dataoperate.JdbcOp.main(JdbcOp.java:89)
一、最簡單就是把<?xml version="1.0" encoding="UTF-8"?>改爲<?xml version="1.0" encoding="gbk"?>(規避方案) 3d
二、或者把xml打開另存的時候把字符集改成UTF-8後保存(推薦) code
三、在代碼解析的時候先把xml從新寫一遍orm
SAXReader reader = new SAXReader(); org.dom4j.Document document = reader.read("D:\\ha.xml"); OutputFormat of = new OutputFormat(); of.setEncoding("UTF-8"); //改變編碼方式 XMLWriter writer = new XMLWriter(new FileWriter "d:\\dom4j.xml"), of);
四、直接dom4j讀取的時候用io來讀,修改字符編碼xml
FileInputStream in = new FileInputStream(new File(fileName)); Reader read = new InputStreamReader(in,"gbk"); Document document = reader.read(read);