这里以解析hibernate.cfg.xml数据库配置信息为例,运用dom4j的解析方式来解析xml文件。
1.在javaWeb工程里新建一个java类,命名为GetXmlValue.java,为xml文件解析工具类。
public class GetXmlValue { //xml文件解析工具类 }
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类的代码如下:
14 15 /** 16 * xml文件解析工具类 17 * 18 * @author ZHN 19 * @version 2017-09-19 18:13:24 20 */ 21 public class GetXmlValue { 22 23 private static String url; 24 private static String username; 25 private static String password; 26 27 /** 28 * 解析xml文件将配置信息写入静态变量 29 * 30 * @param args 31 * @return List<String> 32 */ 33 public static void getValue() { 34 // 解析hibernate.cfg.xml文件 35 // 创建SAXReader的对象reader 36 SAXReader reader = new SAXReader(); 37 String path1 = DBUtil.class.getResource("").getPath().replaceAll("%20", " "); 38 String path2 = path1.substring(0, path1.indexOf("WEB-INF")) + "WEB-INF/classes/"; 39 try{ 40 // 通过reader对象的read方法加载books.xml文件,获取docuemnt对象。 41 Document document = reader.read(new File(path2+"hibernate.cfg.xml")); 42 List<Map<String, Object>> listEle = getElementsToDocument(document); 43 for (Iterator<Map<String, Object>> it = listEle.iterator(); it.hasNext();){ 44 Map<String, Object> map = it.next(); 45 for(String key:map.keySet()){ 46 Element value = (Element)map.get(key); 47 if("property".equals(key)){ 48 // 获取value的属性名以及 属性值 49 @SuppressWarnings("unchecked") 50 List<Attribute> valueAttrs = value.attributes(); 51 for(Attribute attr:valueAttrs){ 52 if("name".equals(attr.getName())&&"connection.url".equals(attr.getValue())){ 53 setUrl(value.getTextTrim()); 54 } 55 if("name".equals(attr.getName())&&"connection.username".equals(attr.getValue())){ 56 setUsername(value.getTextTrim()); 57 } 58 if("name".equals(attr.getName())&&"connection.password".equals(attr.getValue())){ 59 setPassword(value.getTextTrim()); 60 } 61 } 62 } 63 } 64 } 65 }catch(Exception e){ 66 e.printStackTrace(); 67 } 68 } 69 70 /** 71 * dom4j递归解析所有子节点 72 * 73 * @param childElements 74 * @param mapEle 75 * @return 76 */ 77 public static List<Map<String, Object>> getElementsToDocument(Document document) { 78 List<Map<String,Object>> listEle = null; 79 try{ 80 //根节点 81 Element root = document.getRootElement(); 82 //子节点 83 @SuppressWarnings("unchecked") 84 List<Element> childElements = root.elements(); 85 listEle = new ArrayList<Map<String, Object>>(); 86 //遍历子节点 87 listEle = getAllElements(childElements,listEle); 88 }catch(Exception e){ 89 e.printStackTrace(); 90 } 91 return listEle; 92 } 93 94 /** 95 * dom4j递归解析所有子节点 96 * 97 * @param childElements 98 * @param mapEle 99 * @return 100 */ 101 @SuppressWarnings("unchecked") 102 public static List<Map<String, Object>> getAllElements(List<Element> childElements,List<Map<String,Object>> listEle) { 103 for (Element ele:childElements){ 104 Map<String,Object> mapEle = new HashMap<String, Object>(); 105 mapEle.put(ele.getName(), ele); 106 listEle.add(mapEle); 107 if(ele.elements().size()>0){ 108 listEle = getAllElements(ele.elements(), listEle); 109 } 110 } 111 return listEle; 112 } 113 114 public static String getUrl() { 115 return url; 116 } 117 118 public static void setUrl(String url) { 119 GetXmlValue.url = url; 120 } 121 122 public static String getUsername() { 123 return username; 124 } 125 126 public static void setUsername(String username) { 127 GetXmlValue.username = username; 128 } 129 130 public static String getPassword() { 131 return password; 132 } 133 134 public static void setPassword(String password) { 135 GetXmlValue.password = password; 136 } 137 138 }
5.在web.xml文件里配置一个监听器,在javaWeb工程里新建一个类ServletContextLTest,继承类ServletContextListener,
重写contextInitialized方法,调用xml文件解析工具类GetXmlValue的getValue方法,解析xml文件并将值保存到静态变量。
<!-- 配置监听器 在tomcat启动时将数据库配置信息设置到静态变量里 --> <listener> <listener-class>etcom.servlet.ServletContextLTest</listener-class> </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方法获取静态变量的值就行了。