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~
上一篇: windows批处理命令大全
下一篇: 禁止IE兼容模式