`

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

    博客分类:
  • xml
 
阅读更多

最近刚刚做完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详解,包含源代码,dom4j.jar包

    4. 高效性能:DOM4J的内存占用小,解析速度快,尤其适合处理大型XML文档。 二、解析XML的基本步骤 1. 导入依赖:在项目中引入dom4j-1.6.1.jar包,确保能使用DOM4J的所有功能。 2. 创建Document:使用`...

    使用 dom4j 解析 XML

    ### 使用 dom4j 解析 XML #### 一、概述 `dom4j`是一种轻量级、高效且功能丰富的XML处理框架,它提供了一种简单直观的方式来读取、写入和操作XML数据。与传统的DOM API相比,`dom4j`具有更好的性能表现和更加简洁...

    dom4j 解析(读取) xml 节点数据

    接下来,我们将创建一个`SAXReader`实例,它是DOM4J中的解析器,用于读取XML文件: ```java SAXReader reader = new SAXReader(); ``` 然后,使用`reader`读取XML文件并获取`Document`对象,`Document`代表整个XML...

    org.dom4j.jar

    2. **XPath支持**:DOM4J支持XPath表达式,这是对XML文档进行查询的强大工具。通过XPath,我们可以快速定位XML文档中的特定节点,进行数据提取或更新。 3. **事件驱动解析(SAX)**:DOM4J也支持SAX解析器,适用于...

    dom4j解析xml

    ### DOM4J解析XML知识点详解 #### 一、DOM4J简介 DOM4J是一个Java库,用于处理XML文档。它的设计目标是为了提供一个简单、易于使用的API来处理XML文件,同时保持性能上的优势。与Java标准库中的DOM实现相比,DOM4J...

    Dom4j解析XML及中文问题

    本文将深入探讨如何使用Dom4j解析XML以及解决中文乱码的问题。 首先,让我们了解Dom4j的基本用法。在解析XML文件时,通常会使用`DocumentBuilderFactory`和`DocumentBuilder`来创建一个`Document`对象,然后通过这...

    dom4j解析xml.txt

    ### DOM4J解析XML知识点详解 #### 一、DOM4J简介 DOM4J(Document Object Model for XML)是一款用于处理XML文档的轻量级Java库。它提供了一种非常简单且灵活的方式来创建、读取、修改和删除XML文档。DOM4J的主要...

    java_Dom4j解析XML详解

    - 简单易用:DOM4J的API设计友好,使得XML操作更加直观。 - 性能良好:相比于标准DOM,DOM4J具有更好的内存管理,降低了内存消耗。 - 功能强大:支持XPath查询、XML文档修改、事件监听等多种功能。 总结,DOM4J...

    dom4j解析xml文件代码示例

    总结来说,DOM4J为Java开发者提供了一套全面的API来处理XML文档,包括解析、创建、修改和序列化XML。在`CacheInit.java`这个示例中,可能包含了利用DOM4J解析`emailTemplateConfig.xml`文件,提取或修改其中的配置...

    dom4j -1.6.1 源码 dom4j -1.6.1 源码

    4. **异常处理**: dom4j在源码中广泛使用了异常处理机制,如`DocumentException`和`IOException`,确保在处理XML时能捕获并处理可能出现的问题。 **五、使用示例** 以下是一个简单的dom4j使用示例: ```java import...

    dom4j基础入门文档(SAX,DOM,XPATH)

    3. `org.dom4j.CDATA`: 代表XML的CDATA区域,用于包含不能被解析器解析的数据。 4. `org.dom4j.CharacterData`: 是一个标识接口,表示基于字符的节点,如文本节点。 5. `org.dom4j.Comment`: 定义XML注释的行为。 6....

    多层镶嵌xml解析.zip

    通过创建和操作DOM4J的`Element`对象,我们可以方便地解析XML,提取所需数据,并将其存储到自定义的实体类中。对于大型XML文件,可能需要考虑使用更节省内存的解析技术,如SAX或者StAX,以避免内存消耗过大。

    dom4j解析xml文件代码和讲解.pdf

    【DOM4j解析XML文件详解】 DOM4j是一个流行的、灵活的Java库,用于处理XML文档。它提供了全面的功能,包括读取、写入、修改和操作XML文档。DOM4j使用DOM(Document Object Model)的概念,但比标准Java DOM API更轻...

    Dom4j遍历解析XML

    Dom4j(Document Object Model for Java)是一个Java语言的开源XML API,它提供了非常便捷的方式来解析、创建以及操作XML文档。相较于其他XML解析库如SAX、JDOM等,Dom4j具有更强大的功能与更好的性能。 为了使用...

    dom4j基于事件流解析大XML的文件 示例

    2. **性能**:DOM4J不仅支持DOM解析,还支持SAX和STAX解析,后者在处理大型XML文件时能有效减少内存占用。 3. **内存效率**:SAX解析器采用事件驱动模型,只在需要时处理XML元素,避免了内存不足的问题。 4. **易用...

    dom4j 解析xml文件小例子

    4. 查询XML元素:DOM4J提供了XPath支持,可以方便地查询XML文档中的特定元素。 ```java String xpathExpression = "//element[@attribute='value']"; List<Element> matchedElements = document.selectNodes...

    使用dom4j生成和读取hibernate.cfg.xml

    DOM4J是一个开源的Java库,它提供了一套灵活的API来处理XML文档,包括读取、创建、修改和解析XML。相对于标准的Java DOM API,DOM4J更易于使用,且内存占用更低。 1. **生成hibernate.cfg.xml** 生成`hibernate....

Global site tag (gtag.js) - Google Analytics