欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-24 11:42:43
...

最近刚刚做完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~