您的位置:首页 > 其它

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

2016-08-13 00:15 423 查看

写在前面

这一篇介绍如何解析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的组件元素集合。

写在最后

晚安!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: