SAXParseException: The encoding "GBK" is not supported --- 解决办法与分析

原创 2015年07月08日 22:57:34

背景:

解析本地的一个XML文件,文件编码GBK,XML文件头:<?xml version="1.0" encoding="GBK" ?> 

可能的代码:

    1.读取XML文件,获得document对象            
                   SAXReader reader = new SAXReader();               
                   Document   document = reader.read(new File("csdn.xml"));
    2.解析XML形式的文本,得到document对象.
                   String text = "<csdn></csdn>";             
                   Document document = DocumentHelper.parseText(text);
    3.主动创建document对象.
                  Document document = DocumentHelper.createDocument();              //创建根节点
                  Element root = document.addElement("csdn");


运行时抛出异常

SAXParseException: The encoding "GBK" is not supported。

按照网络上说的方法:检查xml的格式,utf-8  去BOM 诸如此类都没有办法解决。


后面发现同样的代码可以在另外正常运行,开始比较差异。

原来是jar包惹的祸:

dom4j-1.6.1.jar 依赖于xerces  对xml解析的实现。

而一般使用的xerces-2.6.2.jar 并不支持GBK的编码格式。

为什么有些情况下又没问题呢?


关键jdk的版本,jdk6后的rt包实现了xml解析,支持gbk,故2种解决方案。

1. 升级xerces.jar

2. 升级jdk 或者(关掉1.4兼容API)


=====原因再分析==========

http://dom4j.sourceforge.net/dom4j-1.6.1/apidocs/org/dom4j/io/SAXReader.html

The actual SAX parser that is used by this class is configurable so you can use your favourite SAX parser if you wish. DOM4J comes configured with its own SAX parser so you do not need to worry about configuring the SAX parser.

To explicitly configure the SAX parser that is used via Java code you can use a constructor or use the setXMLReader(XMLReader)or setXMLReaderClassName(String) methods.

If the parser is not specified explicitly then the standard SAX policy of using the org.xml.sax.driver system property is used to determine the implementation class of XMLReader.

If the org.xml.sax.driver system property is not defined then JAXP is used via reflection (so that DOM4J is not explicitly dependent on the JAXP classes) to load the JAXP configured SAXParser. If there is any error creating a JAXP SAXParser an informational message is output and then the default (Aelfred) SAX parser is used instead.

-------------call trace---------

org.dom4j.io.SAXReader.read(XXXX)

org.dom4j.io.SAXReader.read(InputSource in)

org.dom4j.io.SAXReader.getXMLReader(SAXReader.java:715)

org.dom4j.io.SAXReader.createXMLReader(SAXReader.java:894)

org.dom4j.io.SAXHelper.createXMLReader(SAXHelper.java:83)

org.xml.sax.helpers.XMLReaderFactory.createXMLReader()


先查找 property的值

private static final String property = "org.xml.sax.driver";
public static XMLReader createXMLReader ()
	throws SAXException
    {
	String		className = null;
	ClassLoader	loader = NewInstance.getClassLoader ();
	
	// 1. try the JVM-instance-wide system property
	try { className = System.getProperty (property); }
	catch (RuntimeException e) { /* normally fails for applets */ }

	// 2. if that fails, try META-INF/services/
	if (className == null) {
	    try {
		String		service = "META-INF/services/" + property;
		InputStream	in;
		BufferedReader	reader;

		if (loader == null)
		    in = ClassLoader.getSystemResourceAsStream (service);
		else
		    in = loader.getResourceAsStream (service);

		if (in != null) {
		    reader = new BufferedReader (
			    new InputStreamReader (in, "UTF8"));
		    className = reader.readLine ();
		    in.close ();
		}
	    } catch (Exception e) {
	    }
	}
      // 3. Distro-specific fallback
       if (className == null) {
      // BEGIN DISTRIBUTION-SPECIFIC

        // EXAMPLE:
        // className = "com.example.sax.XmlReader";
        // or a $JAVA_HOME/jre/lib/*properties setting...
            className = "com.sun.org.apache.xerces.internal.parsers.SAXParser";

      // END DISTRIBUTION-SPECIFIC
     }
   // do we know the XMLReader implementation class yet?
    if (className != null)
        return loadClass (loader, className);

    // 4. panic -- adapt any SAX1 parser
    try {
        return new ParserAdapter (ParserFactory.makeParser ());
    } catch (Exception e) {
        throw new SAXException ("Can't create default XMLReader; "
            + "is system property org.xml.sax.driver set?");
    }
  }








版权声明:本文为博主原创文章,转载请声明链接。

相关文章推荐

安装python出现is not a supported wheel on this platform解决办法

安装python库numpy的时候出现numpy-1.12.1+mkl-cp27-cp27m-win32.whl is not a supported wheel on this platform ...

根据wsdl生成客户端:Use of SOAP Encoding is not supported

一.生成方式选择接收到服务端第三方给的wsdl文件,需要在本地生成客户端调用。调用或生成客户端的方式有很多种,可能你会使用eclipse上的插件、IDEA上的插件、使用xfire简单的调用方式等,会碰...

VNC“No configured security type is supported by 3.3 viewer“的解决办法!

VNC“No configured security type is supported by 3.3 viewer“的解决办法! 用移动设备连接PC的VNC服务器端时,总会出现这种奇怪的现...

[SSH]Not supported by BasicDataSource 异常解决办法

此异常出现的原因是由于在 hibernate.cfg.xml 和 applicationContext-common.xml 中都对 DataSource 即连接数据库进行了配置。解决办法是去掉 hi...

解决:DB2com.ibm.db2.jcc.b.DisconnectException: encoding not supported!!

环境是:jdk:1.6    DB2:V9.7 tomcat5 错误描述:使用JDBC连接一下(Driver:com.ibm.db2.jcc.DB2Driver),发生如下错误: 原因分析: ...

sax错误:org.xml.sax.SAXParseException: Content is not allowed in prolog解决

原因及其解决办法: 1.xml编码错误 该xml是UTF-8编码的,如果该文件通过UltraEdit编辑后,会在无BOM头的UTF-8文件中加入BOM,但是DOM4j不认这个BOM(dom4j...
  • p_3er
  • p_3er
  • 2013年09月22日 15:34
  • 6367

linux下”is not in the sudoers file“问题的解决办法

原因当有时候我们使用sudo命令切换用户的时候可能会遇到提示以下错误:xxx is not in the sudoers file. This incident will be reportedxxx...
  • summy_J
  • summy_J
  • 2017年06月02日 17:04
  • 277

The 'Microsoft.Jet.OLEDB.4.0' provider is not registered on the local machine 解决办法

64位操作系统中使用OLEDB去访问access数据库,出现 The 'Microsoft.Jet.OLEDB.4.0' provider is not registered on the local...

安装虚拟机报错解决办法 TheVMware Authorization Service is not running

关于安装虚拟机报错的解决办法 启动VMware出现报错:TheVMware Authorization Service is not running 启动VMware出现报错:...

RHEL下yum更新出现This system is not registered with RHN解决办法

新接手一家公司的运维工作,发现该公司部分服务器使用的系统都是RHEL的,而不是我之前一贯使用的CentOS,系统不一样暂且不谈,今日在yum安装软件时,发现服务器报“This system is no...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SAXParseException: The encoding "GBK" is not supported --- 解决办法与分析
举报原因:
原因补充:

(最多只允许输入30个字)