Java学习系列:使用Dom4j分析xml文件
场景
旧项目使用xml文件进行配置,现在需要改造成微服务项目,为了最小工作量,所以打算复用旧的配置文件,只是改动存储方式。本文主要是讲述使用dom4j进行xml文件读取。
环境
| 软件 | 版本 |
|---|---|
| JDK | 1.8 |
正文
Dom4j介绍
关于dom4j的相关介绍,我直接引用Dom4j_百度百科里面的相关说明。有需要具体了解的,请自行查阅相关资料,或者访问官方网站Dom4j查找具体信息。
dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的。dom4j是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点,它的性能超过sun公司官方的dom技术,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。在IBM developerWorks上面还可以找到一篇文章,对主流的Java XML API进行的性能、功能和易用性的评测,所以可以知道dom4j无论在哪个方面都是非常出色的。如今可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。这已经是必须使用的jar包, Hibernate也用它来读写配置文件。
开发流程
一、引入依赖
这里使用maven进行开发,所以引入以下依赖:
<!-- https://mvnrepository.com/artifact/org.dom4j/dom4j -->
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.3</version>
</dependency>
二、分析XML文件
这里是struts框架的配置文件,整体xml文件结构如下:

我们这里的目标主要是获取action-mappings内部的action子节点,并对应生成对应的对象。博主这里有两个对象,对象属性如下:

ActionConfig内部的forwards的value是ForwardConfig对象。
所以这里的步骤应该是如下:
- 获取根节点;
- 获取 action-mappings节点;
- 获取 action-mappings 节点下面的action节点,将attribute属性赋值至ActionConfig对象,如果存在forward子节点,则赋值至ForwardConfig对象,并更新至ActionConfig对象的forwards属性。
三、编写代码
这里直接展示具体的代码,有需要的看官请自便:
void loadStrutsConfigToObject(String filepath) throws IOException, DocumentException {
log.info("导入配置文件 {}",filepath);
SAXReader reader = new SAXReader();
Document doc = reader.read(FileUtil.file(filepath));
// 获取根节点
Element root = doc.getRootElement();
// 获取 action-mappings 节点下面的action节点集合,并遍历
for (Iterator<Element> it = root.element("action-mappings").elementIterator("action"); it.hasNext();) {
Element element = it.next();
ActionConfig temp = new ActionConfig();
List<Attribute> attributes = element.attributes();
for (int i = 0; i < attributes.size(); i++) {
String attrName = attributes.get(i).getName();
String value =attributes.get(i).getText() ;
switch (attrName) {
case "path" :
// 添加 后缀,方便后期直接对比
temp.setName(value+".do");
temp.setPath(value);
break;
case "scope" :
temp.setScope(value);
break;
case "parameter" :
temp.setParameter(value);
break;
default:
break;
}
}
List<Element> forwards = element.elements("forward");
if (forwards != null && forwards.size() > 0) {
for (int j = 0; j < forwards.size(); j++) {
Element forward = forwards.get(j);
List<Attribute> forwardAttributes = forward.attributes();
ForwardConfig forwardConfig = new ForwardConfig();
for (int t = 0; t < forwardAttributes.size(); t++) {
String forwardAttrName = forwardAttributes.get(t).getName();
String forwardValue =forwardAttributes.get(t).getText() ;
switch (forwardAttrName) {
case "path" :
// 移除 .jsp 字眼,springmvc会自动添加
forwardConfig.setPath(forwardValue.replaceAll(".jsp",""));
break;
case "name" :
forwardConfig.setName(forwardValue);
break;
case "module" :
forwardConfig.setModule(forwardValue);
break;
default:
break;
}
}
temp.getForwards().put(forwardConfig.getName(), forwardConfig);
}
}
// actionConfigMap 为类对象,可以根据需求改为方法内对象
actionConfigMap.put(temp.getName(), temp);
}
log.info("获取的action个数为"+actionConfigMap.size());
}
四、结果展示
运行无报错,成功生成对应的ActionConfig对象。
总结
本次是准备移除旧的Struts框架,而项目比较老,代码量大,所以为了减少工作量,生成原本的旧对象,并根据其逻辑重新编写代码。
随缘求赞
如果我的文章对大家产生了帮忙,可以在文章底部点个赞或者收藏;
如果有好的讨论,可以留言;
如果想继续查看我以后的文章,可以点击关注
可以扫描以下二维码,关注我的公众号:枫夜之求索阁,查看我最新的分享!


浙公网安备 33010602011771号