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

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

  1. public class GetXmlValue {
  2. //xml文件解析工具类
  3. }

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

  1. public class GetXmlValue {
  2.  
  3. private static String url;
  4. private static String username;
  5. private static String password;
  6.  
  7. public static String getUrl() {
  8. return url;
  9. }
  10.  
  11. public static void setUrl(String url) {
  12. GetXmlValue.url = url;
  13. }
  14.  
  15. public static String getUsername() {
  16. return username;
  17. }
  18.  
  19. public static void setUsername(String username) {
  20. GetXmlValue.username = username;
  21. }
  22.  
  23. public static String getPassword() {
  24. return password;
  25. }
  26.  
  27. public static void setPassword(String password) {
  28. GetXmlValue.password = password;
  29. }
  30.  
  31. }

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

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

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

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

  1. /**
  2. * dom4j递归解析所有子节点
  3. *
  4. * @param childElements
  5. * @param mapEle
  6. * @return
  7. */
  8. public static List<Map<String, Object>> getElementsToDocument(Document document) {
  9. List<Map<String,Object>> listEle = null;
  10. try{
  11. //根节点
  12. Element root = document.getRootElement();
  13. //子节点
  14. @SuppressWarnings("unchecked")
  15. List<Element> childElements = root.elements();
  16. listEle = new ArrayList<Map<String, Object>>();
  17. //遍历子节点
  18. listEle = getAllElements(childElements,listEle);
  19. }catch(Exception e){
  20. e.printStackTrace();
  21. }
  22. return listEle;
  23. }
  24.  
  25. /**
  26. * dom4j递归解析所有子节点
  27. *
  28. * @param childElements
  29. * @param mapEle
  30. * @return
  31. */
  32. @SuppressWarnings("unchecked")
  33. public static List<Map<String, Object>> getAllElements(List<Element> childElements,List<Map<String,Object>> listEle) {
  34. for (Element ele:childElements){
  35. Map<String,Object> mapEle = new HashMap<String, Object>();
  36. mapEle.put(ele.getName(), ele);
  37. listEle.add(mapEle);
  38. if(ele.elements().size()>0){
  39. listEle = getAllElements(ele.elements(), listEle);
  40. }
  41. }
  42. return listEle;
  43. }

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

4.1 首先创建SAXReader的对象reader;

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

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

4.4 将Document对象转为List集合;

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

整个java类的代码如下:

  1. /**
  2. * xml文件解析工具类
  3. *
  4. * @author ZHN
  5. * @version 2017-09-19 18:13:24
  6. */
  7. public class GetXmlValue {
  8.  
  9. private static String url;
  10. private static String username;
  11. private static String password;
  12.  
  13. /**
  14. * 解析xml文件将配置信息写入静态变量
  15. *
  16. * @param args
  17. * @return List<String>
  18. */
  19. public static void getValue() {
  20. // 解析hibernate.cfg.xml文件
  21. // 创建SAXReader的对象reader
  22. SAXReader reader = new SAXReader();
  23. String path1 = DBUtil.class.getResource("").getPath().replaceAll("%20", " ");
  24. String path2 = path1.substring(0, path1.indexOf("WEB-INF")) + "WEB-INF/classes/";
  25. try{
  26. // 通过reader对象的read方法加载books.xml文件,获取docuemnt对象。
  27. Document document = reader.read(new File(path2+"hibernate.cfg.xml"));
  28. List<Map<String, Object>> listEle = getElementsToDocument(document);
  29. for (Iterator<Map<String, Object>> it = listEle.iterator(); it.hasNext();){
  30. Map<String, Object> map = it.next();
  31. for(String key:map.keySet()){
  32. Element value = (Element)map.get(key);
  33. if("property".equals(key)){
  34. // 获取value的属性名以及 属性值
  35. @SuppressWarnings("unchecked")
  36. List<Attribute> valueAttrs = value.attributes();
  37. for(Attribute attr:valueAttrs){
  38. if("name".equals(attr.getName())&&"connection.url".equals(attr.getValue())){
  39. setUrl(value.getTextTrim());
  40. }
  41. if("name".equals(attr.getName())&&"connection.username".equals(attr.getValue())){
  42. setUsername(value.getTextTrim());
  43. }
  44. if("name".equals(attr.getName())&&"connection.password".equals(attr.getValue())){
  45. setPassword(value.getTextTrim());
  46. }
  47. }
  48. }
  49. }
  50. }
  51. }catch(Exception e){
  52. e.printStackTrace();
  53. }
  54. }
  55.  
  56. /**
  57. * dom4j递归解析所有子节点
  58. *
  59. * @param childElements
  60. * @param mapEle
  61. * @return
  62. */
  63. public static List<Map<String, Object>> getElementsToDocument(Document document) {
  64. List<Map<String,Object>> listEle = null;
  65. try{
  66. //根节点
  67. Element root = document.getRootElement();
  68. //子节点
  69. @SuppressWarnings("unchecked")
  70. List<Element> childElements = root.elements();
  71. listEle = new ArrayList<Map<String, Object>>();
  72. //遍历子节点
  73. listEle = getAllElements(childElements,listEle);
  74. }catch(Exception e){
  75. e.printStackTrace();
  76. }
  77. return listEle;
  78. }
  79.  
  80. /**
  81. * dom4j递归解析所有子节点
  82. *
  83. * @param childElements
  84. * @param mapEle
  85. * @return
  86. */
  87. @SuppressWarnings("unchecked")
  88. public static List<Map<String, Object>> getAllElements(List<Element> childElements,List<Map<String,Object>> listEle) {
  89. for (Element ele:childElements){
  90. Map<String,Object> mapEle = new HashMap<String, Object>();
  91. mapEle.put(ele.getName(), ele);
  92. listEle.add(mapEle);
  93. if(ele.elements().size()>0){
  94. listEle = getAllElements(ele.elements(), listEle);
  95. }
  96. }
  97. return listEle;
  98. }
  99.  
  100. public static String getUrl() {
  101. return url;
  102. }
  103.  
  104. public static void setUrl(String url) {
  105. GetXmlValue.url = url;
  106. }
  107.  
  108. public static String getUsername() {
  109. return username;
  110. }
  111.  
  112. public static void setUsername(String username) {
  113. GetXmlValue.username = username;
  114. }
  115.  
  116. public static String getPassword() {
  117. return password;
  118. }
  119.  
  120. public static void setPassword(String password) {
  121. GetXmlValue.password = password;
  122. }
  123.  
  124. }

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

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

  1. <!-- 配置监听器 在tomcat启动时将数据库配置信息设置到静态变量里 -->
  2. <listener>
  3. <listener-class>etcom.servlet.ServletContextLTest</listener-class>
  4. </listener>
  1. public class ServletContextLTest implements ServletContextListener{
  2.  
  3. @Override
  4. public void contextDestroyed(ServletContextEvent arg0) {
  5. // TODO Auto-generated method stub
  6.  
  7. }
  8.  
  9. @Override
  10. public void contextInitialized(ServletContextEvent arg0) {
  11. // TODO Auto-generated method stub
  12. GetXmlValue.getValue();
  13. }
  14.  
  15. }

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

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

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

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

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

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

  3. eclipse配置tomcat后修改server.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.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文件——我是如何学习并在短时间内掌握一个库的使用方法的

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

随机推荐

  1. Java数组转集合之Arrays.asList()用法

    Arrays.asList()用法 使用Arrays.asList()的原因无非是想将数组或一些元素转为集合,而你得到的集合并不一定是你想要的那个集合. 而一开始asList的设计时用于打印数组而设计 ...

  2. 浅谈DAO工厂设计模式(工厂模式的好处)

    随着软件分层设计的流行及广泛的应用,对于DAO的设计模式大家已经不再陌生了,DAO层已经在软件系统的开发中成为必不可少的一层,将后台的数据层和前台的VO进行分离.前段时间也针对于DAO的设计介绍过一个 ...

  3. IntelliJ IDEA之如何设置JVM运行参数

    步骤一: 点击IDEA右上角的 Edit Configurations 设置参数: -XX:+PrintGCDetails -Xmx128M -Xms128M 步骤二:在VM options中设置参数 ...

  4. Lenet 神经网络-实现篇(1)

    Lenet 神经网络结构为: ①输入为 32*32*1 的图片大小,为单通道的输入: ②进行卷积,卷积核大小为 5*5*1,个数为 6,步长为 1,非全零填充模式: ③将卷积结果通过非线性激活函数: ...

  5. 从相亲的角度理解 K8S 的 Node Affinity, Taints 与 Tolerations

    这是昨天晚上阅读园子里的2篇 k8s 博文时产生的想法,在随笔中记录一下. 这2篇博文是 K8S调度之节点亲和性 与 K8S调度之Taints and Tolerations . 如果我们把 node ...

  6. ASP.NET/C# Razor视图引擎深入浅出

    在ASPX中我们使用 <% %>在里面编写C#代码在Razor中我们将会使用@{}编写C#代码1.基础——@+属性显示计算1+2的值:<span>1+2=@(1+2)</ ...

  7. spring jdbcTemplate query 返回值为null

    spring jdbcTemplate query 返回值为null 今天使用以下方法从数据库中查询数据,返回列表 public List<BookBean> getBooks(){ St ...

  8. 最小树形图模板 UVA11183

    题意:给定n个节点m条边的有向带权图,求以0为根节点的最小树形图权值大小 用这个代码的时候要注意,这里的数据是从0开始的,边也是从0开始算, 所以在打主代码的时候,如果是从1开始,那么算法里面的从0开 ...

  9. js实现图片选中马上显示功能,选择后可以预览,即选即显

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. js处理文章详情页点击量统计

    具体需求:在文章管理系统中,需要统计文章详情页面的点击量,来体现该文章是否受用户欢迎,方便管理员调整日后编辑新文章时的内容方向. 解决方案:设置有过期时间的cookie 我们在访问文章详情页面时,拿到 ...