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

前端之家收集整理的这篇文章主要介绍了【电信计费系统项目实战】基础篇---解析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的组件元素集合。

写在最后

晚安!

原文链接:https://www.f2er.com/xml/294914.html

猜你在找的XML相关文章