在tomcat启动时解析xml文件,获取特定标签的属性值,并将属性值设置到静态变量里

时间:2022-04-30 15:28:27

这里以解析hibernate.cfg.xml数据库配置信息为例,运用dom4j的解析方式来解析xml文件。

1.在javaWeb工程里新建一个java类,命名为GetXmlValue.java,为xml文件解析工具类。

public class GetXmlValue {
//xml文件解析工具类
}

2.新建三个私有的静态变量,用以保存xml文件解析出来的数据库连接地址、用户名、登录密码,并创建相对应的get和set方法。

 public class GetXmlValue {

     private static String url;
private static String username;
private static String password; public static String getUrl() {
return url;
} public static void setUrl(String url) {
GetXmlValue.url = url;
} public static String getUsername() {
return username;
} public static void setUsername(String username) {
GetXmlValue.username = username;
} public static String getPassword() {
return password;
} public static void setPassword(String password) {
GetXmlValue.password = password;
} }

3.在将xml文件解析为Document对象之后,用一个Map集合来存放Document对象里面每一个节点的名称和节点对象,

由于节点名称可能相同而Map集合的key值是唯一的,所以这里每一个Map集合只存一个节点的信息,将所有的Map放到一个List集合里面,

则这个LIst节后存放的就是xml文件里所有节点(根节点和所有子节点)的信息。由于xml节点呈树状结构,这里就要涉及到递归了,

于是提前写好将Document对象的所有节点存放到LIst集合的方法。

 /**
* dom4j递归解析所有子节点
*
* @param childElements
* @param mapEle
* @return
*/
public static List<Map<String, Object>> getElementsToDocument(Document document) {
List<Map<String,Object>> listEle = null;
try{
//根节点
Element root = document.getRootElement();
//子节点
@SuppressWarnings("unchecked")
List<Element> childElements = root.elements();
listEle = new ArrayList<Map<String, Object>>();
//遍历子节点
listEle = getAllElements(childElements,listEle);
}catch(Exception e){
e.printStackTrace();
}
return listEle;
} /**
* dom4j递归解析所有子节点
*
* @param childElements
* @param mapEle
* @return
*/
@SuppressWarnings("unchecked")
public static List<Map<String, Object>> getAllElements(List<Element> childElements,List<Map<String,Object>> listEle) {
for (Element ele:childElements){
Map<String,Object> mapEle = new HashMap<String, Object>();
mapEle.put(ele.getName(), ele);
listEle.add(mapEle);
if(ele.elements().size()>0){
listEle = getAllElements(ele.elements(), listEle);
}
}
return listEle;
}

4.接下来要写主要逻辑了。

4.1 首先创建SAXReader的对象reader;

4.2 获取带解析xml文件的文件路径;

4.3 将xml文件加载成Document对象;

4.4 将Document对象转为List集合;

4.5 遍历List集合得到map集合,遍历map集合得到特定xml标签的文本值,将值set到相对应静态变量里。

整个java类的代码如下:

 /**
* xml文件解析工具类
*
* @author ZHN
* @version 2017-09-19 18:13:24
*/
public class GetXmlValue { private static String url;
private static String username;
private static String password; /**
* 解析xml文件将配置信息写入静态变量
*
* @param args
* @return List<String>
*/
public static void getValue() {
// 解析hibernate.cfg.xml文件
// 创建SAXReader的对象reader
SAXReader reader = new SAXReader();
String path1 = DBUtil.class.getResource("").getPath().replaceAll("%20", " ");
String path2 = path1.substring(0, path1.indexOf("WEB-INF")) + "WEB-INF/classes/";
try{
// 通过reader对象的read方法加载books.xml文件,获取docuemnt对象。
Document document = reader.read(new File(path2+"hibernate.cfg.xml"));
List<Map<String, Object>> listEle = getElementsToDocument(document);
for (Iterator<Map<String, Object>> it = listEle.iterator(); it.hasNext();){
Map<String, Object> map = it.next();
for(String key:map.keySet()){
Element value = (Element)map.get(key);
if("property".equals(key)){
// 获取value的属性名以及 属性值
@SuppressWarnings("unchecked")
List<Attribute> valueAttrs = value.attributes();
for(Attribute attr:valueAttrs){
if("name".equals(attr.getName())&&"connection.url".equals(attr.getValue())){
setUrl(value.getTextTrim());
}
if("name".equals(attr.getName())&&"connection.username".equals(attr.getValue())){
setUsername(value.getTextTrim());
}
if("name".equals(attr.getName())&&"connection.password".equals(attr.getValue())){
setPassword(value.getTextTrim());
}
}
}
}
}
}catch(Exception e){
e.printStackTrace();
}
} /**
* dom4j递归解析所有子节点
*
* @param childElements
* @param mapEle
* @return
*/
public static List<Map<String, Object>> getElementsToDocument(Document document) {
List<Map<String,Object>> listEle = null;
try{
//根节点
Element root = document.getRootElement();
//子节点
@SuppressWarnings("unchecked")
List<Element> childElements = root.elements();
listEle = new ArrayList<Map<String, Object>>();
//遍历子节点
listEle = getAllElements(childElements,listEle);
}catch(Exception e){
e.printStackTrace();
}
return listEle;
} /**
* dom4j递归解析所有子节点
*
* @param childElements
* @param mapEle
* @return
*/
@SuppressWarnings("unchecked")
public static List<Map<String, Object>> getAllElements(List<Element> childElements,List<Map<String,Object>> listEle) {
for (Element ele:childElements){
Map<String,Object> mapEle = new HashMap<String, Object>();
mapEle.put(ele.getName(), ele);
listEle.add(mapEle);
if(ele.elements().size()>0){
listEle = getAllElements(ele.elements(), listEle);
}
}
return listEle;
} public static String getUrl() {
return url;
} public static void setUrl(String url) {
GetXmlValue.url = url;
} public static String getUsername() {
return username;
} public static void setUsername(String username) {
GetXmlValue.username = username;
} public static String getPassword() {
return password;
} public static void setPassword(String password) {
GetXmlValue.password = password;
} }

5.在web.xml文件里配置一个监听器,在javaWeb工程里新建一个类ServletContextLTest,继承类ServletContextListener,

重写contextInitialized方法,调用xml文件解析工具类GetXmlValue的getValue方法,解析xml文件并将值保存到静态变量。

<!-- 配置监听器 在tomcat启动时将数据库配置信息设置到静态变量里 -->
<listener>
<listener-class>etcom.servlet.ServletContextLTest</listener-class>
</listener>
 public class ServletContextLTest implements ServletContextListener{

     @Override
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub } @Override
public void contextInitialized(ServletContextEvent arg0) {
// TODO Auto-generated method stub
GetXmlValue.getValue();
} }

6.在需要用到配置信息的代码里直接通过GetXmlValue类的相对应get方法获取静态变量的值就行了。

在tomcat启动时解析xml文件,获取特定标签的属性值,并将属性值设置到静态变量里的更多相关文章

  1. 在java项目中怎样利用Dom4j解析XML文件获取数据

    在曾经的学习.net时常常会遇到利用配置文件来解决项目中一些须要常常变换的数据.比方数据库的连接字符串儿等.这个时候在读取配置文件的时候.我们一般会用到一个雷configuration,通过这个类来进 ...

  2. python xml&period;etree&period;ElementTree解析xml文件获取节点

    <?xml version = "1.0" encoding = "utf-8"?> <root> <body name=&quo ...

  3. eclipse配置tomcat后修改server&period;xml文件(如编码等)无效问题

    我们用eclipse配置好tomcat后,在处理中文乱码或是配置数据源时,我们要修改Tomcat下的server.xml等文件. 修改后重启Tomcat服务器时发现xml文件又被还原了. 因为Tomc ...

  4. 用js解析XML文件,字符串一些心得

    解析XML文件遇到的问题 今天秦博士叫我解析一下XML文件,将里面的所有的X坐标Y坐标放在一个数组里面然后写在文档里让他进行算法比对,大家都知道了啦,解析XML文件获取里面的坐标数据什么的,当然是用前 ...

  5. 用js(JavaScript-jQuery)解析XML文件 无法成功 获得XML对象,字符串一些心得

    原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/7822962.html 解析XML文件遇到的问题 今天秦博士叫我解析一下XML文件,将里面的所有 ...

  6. Tomcat启动时加载数据到缓存---web&period;xml中listener加载顺序(例如顺序:1、初始化spring容器,2、初始化线程池,3、加载业务代码,将数据库中数据加载到内存中)

    最近公司要做功能迁移,原来的后台使用的Netty,现在要迁移到在uap上,也就是说所有后台的代码不能通过netty写的加载顺序加载了. 问题就来了,怎样让迁移到tomcat的代码按照原来的加载顺序进行 ...

  7. python解析xml文件时使用ElementTree和cElementTree的不同点;iter

    在python中,解析xml文件时,会选用ElementTree或者cElementTree,那么两者有什么不同呢? 1.cElementTree速度上要比ElementTree快,比较cElemen ...

  8. Java 创建过滤器 解析xml文件

    今天写了一个过滤器demo,现在是解析actions.xml文件,得到action中的业务规则:不需要导入任何jar包 ActionFilter过滤器类: package accp.com.xh.ut ...

  9. ACEXML解析XML文件&mdash&semi;&mdash&semi;我是如何学习并在短时间内掌握一个库的使用方法的

    最近做的C++项目中需要使用xml文件保存一些信息,程序启动时会读取这些信息.最终经过主程的评测,决定使用ACEXML库来读取解析XML文件. 好吧,至于为什么选择ACEXML库,我就不说了.既然选择 ...

随机推荐

  1. HDU3555 Bomb&lbrack;数位DP&rsqb;

    Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Submi ...

  2. iOS 瀑布流的基本原理

    /** * 源代码链接 * 链接: https://pan.baidu.com/s/1nvLamEX 密码: kya5 */ #import <UIKit/UIKit.h> @interf ...

  3. WPF&colon;xmal 静动态资源

    <StackPanel.Resources> <SolidColorBrush x:Key="myBrush" Color="Teal"/&g ...

  4. IT大数据服务管理高级课程&lpar;IT服务,大数据,云计算,智能城市&rpar;

    个人简历 金石先生是马克思主义中国化的研究学者,上海财经大学经济学和管理学硕士,中国*建国会成员,中国特色*人文科技管理哲学的理论奠基人之一.金石先生博学多才,对问题有独到见解.专于工作且乐于 ...

  5. 数组(Array)资源

    上面的程序中在Java代码中定义了两个数组,Android并不推荐在Java代码中定义数组,因为Androd允许通过资源文件来定义数组资源. Android采用位于/res/values目录下的arr ...

  6. Jupyter-NoteBook-你应该知道的N个小技巧

    智能决策上手系列教程索引 不断更新部分内容来自于翻译整理 多行输出 在Notebook的中开头cell中添加以下代码可以实现多行输出: from IPython.core.interactiveshe ...

  7. &lbrack;C&plus;&plus;&rsqb;2-2 韩信点兵

    /* 韩信点兵 相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排.五人一排.七人一排地变换队 形,而他每次只掠一眼队伍的排尾就知道总人数了.输入多组数据,每组数据包含3个非负整数 ...

  8. oracle11g dataguard 备库数据同步的检查方法

    概述: 一.环境      主库:       ip地址:192.168.122.203       oracle根目录:/data/db/oracle       SID:qyq       数据文 ...

  9. 简单了解json以及使用google json 2&period;2

    json简介: JSON: JavaScript对象表示法(JavaScript Object Notation) JSON是存储和交换信息的语法. JSON是轻量级的文本交互格式 JSON独立于语言 ...

  10. 方法 中 void 的解释