Java学习系列:使用Dom4j分析xml文件

场景

旧项目使用xml文件进行配置,现在需要改造成微服务项目,为了最小工作量,所以打算复用旧的配置文件,只是改动存储方式。本文主要是讲述使用dom4j进行xml文件读取。

环境

软件版本
JDK1.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对象。

所以这里的步骤应该是如下:

  1. 获取根节点;
  2. 获取 action-mappings节点;
  3. 获取 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框架,而项目比较老,代码量大,所以为了减少工作量,生成原本的旧对象,并根据其逻辑重新编写代码。

随缘求赞

如果我的文章对大家产生了帮忙,可以在文章底部点个赞或者收藏;
如果有好的讨论,可以留言;
如果想继续查看我以后的文章,可以点击关注
可以扫描以下二维码,关注我的公众号:枫夜之求索阁,查看我最新的分享!
在这里插入图片描述
拜拜

posted on 2022-11-29 18:39  枫夜求索阁  阅读(75)  评论(0)    收藏  举报

导航