xml文件太大了,我昨天找了好长时间找到无效字符的列,就是上面的那种特殊字符!! 这是解析的时候的异常信息 Exception in thread "main" org.xml.sax.SAXParseException; systemId: file:/D:/Java/workspace/weibousertest/data/NLPIR%E5%BE%AE%E5%8D%9A%E5%8D%9A%E4%B8%BB%E8%AF%AD%E6%96%99%E5%BA%93.xml; lineNumber: 608194; columnNumber: 112; 在文档的元素内容中找到无效的 XML 字符 (Unicode: 0xe)。 at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:198) at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177) at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:441) at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:368) at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1388) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2856) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:607) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:489) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:835) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764) at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:123) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1210) at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:568) at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(SAXParserImpl.java:302) at javax.xml.parsers.SAXParser.parse(SAXParser.java:328) at weibo.SAXCreateDB.main(SAXCreateDB.java:24)
这是解析的时候的异常信息
Exception in thread "main" org.xml.sax.SAXParseException; systemId: file:/D:/Java/workspace/weibousertest/data/NLPIR%E5%BE%AE%E5%8D%9A%E5%8D%9A%E4%B8%BB%E8%AF%AD%E6%96%99%E5%BA%93.xml; lineNumber: 608194; columnNumber: 112; 在文档的元素内容中找到无效的 XML 字符 (Unicode: 0xe)。
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:198)
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:441)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:368)
at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1388)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2856)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:607)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:489)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:835)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:123)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1210)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:568)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(SAXParserImpl.java:302)
at javax.xml.parsers.SAXParser.parse(SAXParser.java:328)
at weibo.SAXCreateDB.main(SAXCreateDB.java:24)
<!DOCTYPE PERSONS [
<!ENTITY nbsp " ">
<!ENTITY copy "©">
<!ENTITY reg "®">
<!ENTITY trade "™">
<!ENTITY mdash "—">
<!ENTITY ldquo "“">
<!ENTITY rdquo "”">
<!ENTITY pound "£">
<!ENTITY yen "¥">
<!ENTITY euro "€">
]>
<PERSONS>
<person>
<summary>L仔,Worldwide,Bboyworld DJ成員,美國Dragon Diggers
DJ團長,『壹陆叁』創辦人,廣州Energy音樂總監,周館弟子,KC劍球隊員,唱盤主義,老巨蟹,黑膠收藏</summary>
</person>
</PERSONS>异常信息:
就是这些字符破坏了 XML 文件。
可以如图看到这个 SO,也可以用二进制编辑器看到,其值是0E
点:这里所讲的原始码都是指Unicode码),并规定:多字节码(2个字
节以上才称为多字节)以转换后第1个字节起头的连续“1”的数目(这
些连续“1”称为标记位),表示转换成几个字节:“110”连续两个
“1”,表示转换结果为2个字节,“1110”表示3个字节,而“11110”
则表示4个字节……跟随在标记位之后的“0”,其作用是分隔标记位和
字符码位。第2~第4个字节的起头两个位固定设置为“10”,也作为标
记,剩下的6个位才做为字符码位使用。
这样,2字节UTF-8码剩下11个字符码位,可用以转换0080~07FF的
原始字符码,3字节剩下16个字符码位,可用以转换0800~FFFF的原始字
符码,由此类推。编码方式的模板如下:原始码(16进制) UTF-8编码(二进制)
--------------------------------------------
0000 - 007F 0xxxxxxx
0080 - 07FF 110xxxxx 10xxxxxx
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx 参考 ASCII 码表,很明显,这些非不可见的字符都是控制字符,在0000 - 007F 0xxxxxxx
如果不是严格的考虑(如不完整的 UTF-8编码),只需要简单的删除这些不可见字符,只要用按字节读取文件,每个字节都比较一下,如果是控制字符(例如上面的 0E),直接丢掉,而其他的字节仍按顺序保存到新的 XML 文件里。