微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

【电信计费系统项目实战】基础篇---解析XML文件

写在前面

这一篇介绍如何解析xml文件,因项目中的角色管理有个权限列表

为了方便管理,我们用privileges.xml存储权限操作信息。

解析xml文件

用privileges.xml存储权限操作信息的代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<privileges>
    <privilege id="1">
        <name>角色管理</name>
        <urls>
            <url>/findRole.action</url>
            <url>/toAddRole.action</url>
            <url>/addRole.action</url>
            <url>/toUpdateRole.action</url>
            <url>/updateRole.action</url>
            <url>/deleteRole.action</url>
        </urls>
    </privilege>
    <privilege id="2">
        <name>管理员</name>
        <urls>
            <url>/findAdmin.action</url>
            <url>/toAddAdmin.action</url>
            <url>/addAdmin.action</url>
            <url>/toUpdateAdmin.action</url>
            <url>/updateAdmin.action</url>
            <url>/deleteAdmin.action</url>
            <url>/resetPassword.action</url>
        </urls>
    </privilege>
    <privilege id="3">
        <name>资费管理</name>
        <urls>
            <url>/findcost.action</url>
            <url>/addcost.action</url>
            <url>/toUpdateCost.action</url>
            <url>/updateCost.action</url>
        </urls>
    </privilege>
    <privilege id="4">
        <name>账务账号</name>
        <urls>
            <url>/findAccount.action</url>
            <url>/addAccount.action</url>
            <url>/toUpdateAccount.action</url>
            <url>/updateAccount.action</url>
            <url>/startAccount.action</url>
            <url>/pauseAccount.action</url>
            <url>/deleteAccount.action</url>
            <url>/viewAccount.action</url>
        </urls>
    </privilege>
    <privilege id="5">
        <name>业务账号</name>
        <urls>
            <url>/findService.action</url>
            <url>/toAddService.action</url>
            <url>/addService.action</url>
            <url>/toUpdateService.action</url>
            <url>/updateService.action</url>
            <url>/pauseService.action</url>
            <url>/deleteService.action</url>
        </urls>
    </privilege>
    <privilege id="6">
        <name>账单</name>
        <urls>
            <url>/billList.action</url>
            <url>/billItemList.action</url>
            <url>/billServiceDetail.action</url>
        </urls>
    </privilege>
    <privilege id="7">
        <name>报表</name>
        <urls>
            <url>/report.action</url>
        </urls>
    </privilege>
</privileges>

解析xml文件的方式有多种,我这里是用SAXReader的方式来解析,使用SAXReader需要导入dom4j.jar包,dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个非常非常优秀的Java XML API。那我们来看看我们项目是怎么解析privileges.xml里存储的权限操作信息的。

package com.tarena.util;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import com.tarena.entity.Privilege;

/** * 解析privileges.xml工具类 */
public class PrivilegeReader {

    // 用于存储privileges.xml的权限操作信息
    private static List<Privilege> privileges = new ArrayList<Privilege>();

    static {
        InputStream xml = PrivilegeReader.class.getClassLoader()
                .getResourceAsstream("privileges.xml");
        privileges = toModuleList(xml);
    }

    /** * 返回XML中所有权限数据 * * @return */
    public static List<Privilege> getPrivileges() {
        return privileges;
    }

    /** * 根据权限ID查询模块名称 * * @param id * @return */
    public static String getPrivilegeNameById(String id) {
        List<Privilege> privileges = getPrivileges();
        for (Privilege privilege : privileges) {
            if (privilege.getId().equals(id)) {
                return privilege.getName();
            }
        }
        return null;
    }

    /** * 解析privileges.xml文件 * * @param xml * @return */
    @SuppressWarnings("unchecked")
    protected static List<Privilege> toModuleList(InputStream xml) {
        List<Privilege> modules = new ArrayList<Privilege>();
        try {
            SAXReader reader = new SAXReader();
            Document doc = reader.read(xml);
            Element root = doc.getRootElement();
            List<Element> moduleElements = root.elements("privilege");
            for (Element moduleElement : moduleElements) {
                Privilege module = new Privilege();
                module.setId(moduleElement.attributeValue("id"));
                module.setName(moduleElement.elementText("name"));
                Element urlElement = moduleElement.element("urls");
                List<Element> urlElements = urlElement.elements();
                List<String> urls = new ArrayList<String>();
                for (Element element : urlElements) {
                    urls.add(element.getText());
                }
                module.setUrls(urls);
                modules.add(module);
            }

            return modules;
        } catch (DocumentException e) {
            e.printstacktrace();
            throw new RuntimeException("解析权限文件失败!",e);
        }
    }

    public static void main(String[] args) {
        List<Privilege> list = PrivilegeReader.getPrivileges();
        for (Privilege p : list) {
            System.out.println(p.getId() + " " + p.getName());
        }
    }

}

先直接看下解析后的结果,运行main方法可以看到:

ok,xml里的权限信息都被解析出来了。

解释:

InputStream xml = PrivilegeReader.class.getClassLoader()
.getResourceAsstream(“privileges.xml”);

PrivilegeReader.class是获得对象当前的类类型,然后在类类型上调用getClassLoader()方法是得到当前类型的类加载器,我们知道在Java中所有的类都是通过加载器加载到虚拟机中的,最后调用了类加载器的getResourceAsstream()方法来加载资源。

SAXReader reader = new SAXReader();
Document doc = reader.read(xml);
Element root = doc.getRootElement();
List moduleElements = root.elements(“privilege”);

Document doc = reader.read(xml),生成文档对应实体 。Element root = doc.getRootElement(),读取文档根元素。List moduleElements = root.elements(“privilege”),获取根元素为privilege的组件元素集合。

写在最后

晚安!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念
xml文件介绍及使用
xml编程(一)-xml语法
XML文件结构和基本语法
第2章 包装类