dom4j解析创建Xml:org.dom4j.DocumentException: 2字节的UTF-8序列的2无效

最近刚刚做完Java版Dota改键软件KeyHelper的界面配置操作,配置信息保存到xml中,采用dom4j进行解析和创建,基本做的差不多,并导出为jar自己在使用测试。

在Eclipse中运行时没有任何异常和错误,但是导出jar包之后使用start java -jar keyHelper.jar运行的时候,报异常:org.dom4j.DocumentException: 2字节的UTF-8序列的2无效...后面是一大串错误stack信息。

搜索了一下,网上关于dom4j解析xml汉字乱码问题一大堆,其中解决办法基本没有,大都是在网上发发问题,但是没有人解决,只有一个提到说将xml的编码改成为GBK或者GB2312,这个测试了,基本上是可行的,但是一般的软件开发都是采用UTF-8,将配置换成其他编码,会导致软件界面上是乱码,所以这个解决办法其实有一点鸡肋。自己尝试过在创建保存xml的时候,利用构造的domcument,调用asXml()方法得到document的string字符串,然后采用java io利用utf-8编码写入文件中,但是到读取的时候依然会报错。

再三折腾之下,发现了一个既不用修改xml编码,又可以解决这个中文解析的异常,贴出我的解析的创建xml的代码。

一、解析Config.xml配置信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private void loadFromXml() {
     try {
         AXReader reader = new SAXReader();
         File file = new File(CONFIG_FILE);
         Document document = reader.read( new BufferedReader( new InputStreamReader( new FileInputStream(file), "UTF-8" ))); // 读取XML文件
         Element xmlRoot = document.getRootElement(); // 得到根节点
         lastKeySet = xmlRoot.elementText( "lastKeySet" );
         lastLocationX = Integer.valueOf(xmlRoot.elementText( "lastLocationX" ));
         lastLocationY = Integer.valueOf(xmlRoot.elementText( "lastLocationY" ));
        } catch (Exception e) {
         e.printStackTrace();
         lastKeySet = "" ; //上次选择的改键方案
         lastLocationX = 500 ; //上次窗口位置
         lastLocationY = 100 ; //上次窗口位置
     }
}

其中代码:Document document = reader.read(newBufferedReader(newInputStreamReader(newFileInputStream(file), "UTF-8")));是关键。

二、创建Config.xml配置信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public void saveToXml() {
     /** 建立document对象 */
     Document document = DocumentHelper.createDocument();
     /** 建立config根节点 */
     Element configElement = document.addElement( "config" );
     configElement.addElement( "lastKeySet" ).setText(lastKeySet);
     configElement.addElement( "lastLocationX" ).setText(lastLocationX + "" );
     configElement.addElement( "lastLocationY" ).setText(lastLocationY + "" );
     try {
         /* 将document中的内容写入文件中 */
         OutputFormat format = new OutputFormat();
         format.setEncoding( "UTF-8" );
         XMLWriter writer = new XMLWriter( new FileOutputStream( new File(CONFIG_FILE)), format);
         writer.write(document);
         writer.close();          
     } catch (Exception ex) {
         ex.printStackTrace();
     }
}

其中代码:

OutputFormat format = newOutputFormat();

format.setEncoding("UTF-8");

XMLWriter writer = newXMLWriter(newFileOutputStream(newFile(CONFIG_FILE)), format);

是关键,请务必按照这个写法进行。具体为什么,我自己也不知道,唉~

Enjoy~

你可能感兴趣的:(dom4j解析创建Xml:org.dom4j.DocumentException: 2字节的UTF-8序列的2无效)