写在前面
这一篇介绍如何解析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的组件元素集合。
写在最后
晚安!