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配置信息
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配置信息
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~

0 个评论

要回复文章请先登录注册