发这个 XML 文件来看看,XML 支持 UTF-8编码的,这种字符也是有效的编码,不应该无效。

解决方案 »

  1.   

    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)
      

  2.   

    xml文件:<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE PERSONS [
    <!ENTITY nbsp "&#160;">
    <!ENTITY copy "&#169;">
    <!ENTITY reg "&#174;">
    <!ENTITY trade "&#8482;">
    <!ENTITY mdash "&#8212;">
    <!ENTITY ldquo "&#8220;">
    <!ENTITY rdquo "&#8221;"> 
    <!ENTITY pound "&#163;">
    <!ENTITY yen "&#165;">
    <!ENTITY euro "&#8364;">
    ]>
    <PERSONS>
    <person>
    <summary>L仔,Worldwide,Bboyworld DJ成員,美國Dragon Diggers
    DJ團長,『壹陆叁』創辦人,廣州Energy音樂總監,周館弟子,KC劍球隊員,唱盤主義,老巨蟹,黑膠收藏</summary>
    </person>
    </PERSONS>异常信息:
      

  3.   

    关键这只是我找到的中间一个的无效字符,整个xml中还有的是
      

  4.   

    复制xml有一点没复制上?
      

  5.   

    复制你的 XML,会发现里面有一些不可见的字符,例如 SO (Shift Out).
    就是这些字符破坏了 XML 文件。
    可以如图看到这个 SO,也可以用二进制编辑器看到,其值是0E
      

  6.   

    我不知道有没有工具可以把 UTF-8存储的文件中非法的字符去掉,但是可以自己写程序利用UTF-8的原理,把这些非法字符删除。UTF-8 是以 8位(即 1个字节)为单元对原始码进行编码(注意一
    点:这里所讲的原始码都是指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 文件里。
      

  7.   

    在 UTF-8中,ASCII 码的第一个bit都是0,而其他字符的第一个bit都是1,所以可以直接进行比较,不用担心破坏多UTF-8里多字节的字符的编码。