xml读取异常Invalid byte 1 of 1-byte UTF-8 sequence
说简单点当你解析别人的xml格式出现这个错误可能就是别人在生成xml时没有保存为utf-8的字符编码格式。
在中文版的window下java的默认的编码为GBK,也就是所虽然我们标识了要将xml保存为utf-8格式但实际上文件是以GBK格式来保存的,所以这也就是为什么能够我们使用GBK、GB2312编码来生成xml文件能正确的被解析,而以UTF-8格式生成的文件不能被xml解析器所解析的原因。
xml解析时遇到的编码异常:
- org.dom4j.DocumentException:Invalidbyte1of1-byteUTF-8sequence.Nestedexception:Invalid8sequence.
- atorg.dom4j.io.SAXReader.read(SAXReader.java:484)
- atorg.dom4j.io.SAXReader.read(SAXReader.java:321)
- atcom.dataoperate.PaseXml.pXml(PaseXml.java:28)
- atcom.dataoperate.JdbcOp.insertDb(JdbcOp.java:30)
- atcom.dataoperate.JdbcOp.main(JdbcOp.java:89)
- Nestedexception:
- com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException:Invalid8sequence.
- atcom.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(UTF8Reader.java:684)
- atcom.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(UTF8Reader.java:554)
- atcom.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEntityScanner.java:1742)
- atcom.sun.org.apache.xerces.internal.impl.XMLEntityScanner.peekChar(XMLEntityScanner.java:487)
- atcom.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2687)
- atcom.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)
- atcom.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140)
- atcom.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511)
- atcom.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808)
- atcom.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
- atcom.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119)
- atcom.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
- atcom.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
- 465)
- Nestedexception:com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException:Invalid atcom.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(UTF8Reader.java:684)
- atcom.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(UTF8Reader.java:554)
- atcom.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEntityScanner.java:1742)
- atcom.sun.org.apache.xerces.internal.impl.XMLEntityScanner.peekChar(XMLEntityScanner.java:487)
- atcom.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2687)
- atcom.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)
- atcom.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140)
- atcom.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511)
- 808)
- 737)
- atcom.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119)
- atcom.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
- atcom.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
- 465)
- 321)
- atcom.dataoperate.PaseXml.pXml(PaseXml.java:28)
- atcom.dataoperate.JdbcOp.insertDb(JdbcOp.java:30)
- atcom.dataoperate.JdbcOp.main(JdbcOp.java:89)
1、最简单就是把<?xml version="1.0" encoding="UTF-8"?>改成<?xml version="1.0" encoding="gbk"?>
2、或者把xml打开另存的时候把字符集改为UTF-8后保存
3、在代码解析的时候先把xml重新写一遍
[javascript]
copy
- SAXReaderreader=newSAXReader();
- org.dom4j.Documentdocument=reader.read("D:\\ha.xml");
- OutputFormatof=newOutputFormat();
- of.setEncoding("UTF-8");//改变编码方式
- XMLWriterwriter=newXMLWriter(newFileWriter"d:\\dom4j.xml"),of);