最近刚刚做完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~
相关推荐
4. 高效性能:DOM4J的内存占用小,解析速度快,尤其适合处理大型XML文档。 二、解析XML的基本步骤 1. 导入依赖:在项目中引入dom4j-1.6.1.jar包,确保能使用DOM4J的所有功能。 2. 创建Document:使用`...
### 使用 dom4j 解析 XML #### 一、概述 `dom4j`是一种轻量级、高效且功能丰富的XML处理框架,它提供了一种简单直观的方式来读取、写入和操作XML数据。与传统的DOM API相比,`dom4j`具有更好的性能表现和更加简洁...
接下来,我们将创建一个`SAXReader`实例,它是DOM4J中的解析器,用于读取XML文件: ```java SAXReader reader = new SAXReader(); ``` 然后,使用`reader`读取XML文件并获取`Document`对象,`Document`代表整个XML...
2. **XPath支持**:DOM4J支持XPath表达式,这是对XML文档进行查询的强大工具。通过XPath,我们可以快速定位XML文档中的特定节点,进行数据提取或更新。 3. **事件驱动解析(SAX)**:DOM4J也支持SAX解析器,适用于...
### DOM4J解析XML知识点详解 #### 一、DOM4J简介 DOM4J是一个Java库,用于处理XML文档。它的设计目标是为了提供一个简单、易于使用的API来处理XML文件,同时保持性能上的优势。与Java标准库中的DOM实现相比,DOM4J...
本文将深入探讨如何使用Dom4j解析XML以及解决中文乱码的问题。 首先,让我们了解Dom4j的基本用法。在解析XML文件时,通常会使用`DocumentBuilderFactory`和`DocumentBuilder`来创建一个`Document`对象,然后通过这...
### DOM4J解析XML知识点详解 #### 一、DOM4J简介 DOM4J(Document Object Model for XML)是一款用于处理XML文档的轻量级Java库。它提供了一种非常简单且灵活的方式来创建、读取、修改和删除XML文档。DOM4J的主要...
- 简单易用:DOM4J的API设计友好,使得XML操作更加直观。 - 性能良好:相比于标准DOM,DOM4J具有更好的内存管理,降低了内存消耗。 - 功能强大:支持XPath查询、XML文档修改、事件监听等多种功能。 总结,DOM4J...
总结来说,DOM4J为Java开发者提供了一套全面的API来处理XML文档,包括解析、创建、修改和序列化XML。在`CacheInit.java`这个示例中,可能包含了利用DOM4J解析`emailTemplateConfig.xml`文件,提取或修改其中的配置...
4. **异常处理**: dom4j在源码中广泛使用了异常处理机制,如`DocumentException`和`IOException`,确保在处理XML时能捕获并处理可能出现的问题。 **五、使用示例** 以下是一个简单的dom4j使用示例: ```java import...
3. `org.dom4j.CDATA`: 代表XML的CDATA区域,用于包含不能被解析器解析的数据。 4. `org.dom4j.CharacterData`: 是一个标识接口,表示基于字符的节点,如文本节点。 5. `org.dom4j.Comment`: 定义XML注释的行为。 6....
通过创建和操作DOM4J的`Element`对象,我们可以方便地解析XML,提取所需数据,并将其存储到自定义的实体类中。对于大型XML文件,可能需要考虑使用更节省内存的解析技术,如SAX或者StAX,以避免内存消耗过大。
【DOM4j解析XML文件详解】 DOM4j是一个流行的、灵活的Java库,用于处理XML文档。它提供了全面的功能,包括读取、写入、修改和操作XML文档。DOM4j使用DOM(Document Object Model)的概念,但比标准Java DOM API更轻...
Dom4j(Document Object Model for Java)是一个Java语言的开源XML API,它提供了非常便捷的方式来解析、创建以及操作XML文档。相较于其他XML解析库如SAX、JDOM等,Dom4j具有更强大的功能与更好的性能。 为了使用...
2. **性能**:DOM4J不仅支持DOM解析,还支持SAX和STAX解析,后者在处理大型XML文件时能有效减少内存占用。 3. **内存效率**:SAX解析器采用事件驱动模型,只在需要时处理XML元素,避免了内存不足的问题。 4. **易用...
4. 查询XML元素:DOM4J提供了XPath支持,可以方便地查询XML文档中的特定元素。 ```java String xpathExpression = "//element[@attribute='value']"; List<Element> matchedElements = document.selectNodes...
DOM4J是一个开源的Java库,它提供了一套灵活的API来处理XML文档,包括读取、创建、修改和解析XML。相对于标准的Java DOM API,DOM4J更易于使用,且内存占用更低。 1. **生成hibernate.cfg.xml** 生成`hibernate....