`
mr_wangjq
  • 浏览: 40831 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JAVA项目使用dom4j初始化xml配置文件类

阅读更多

单例模式加载配置文件类

使用架包:dom4j-1.6.1.jar、jaxen-1.1-beta-6.jar、log4j-1.2.17.jar

代码:

package com.wjq.project.loadFile;

import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

/**
 * @Title:JAVA项目初始化xml配置文件类
 * @Description: 使用dom4j解析xml配置文件; 使用单例模式初始化类; 定时重新加载配置文件,时间可配
 * @author wjq
 * @date 2013-07-19
 */
public class LoadXmlFile_dom4j {
	//日志
	private static Logger log = Logger.getLogger(LoadXmlFile_dom4j.class);
	//配置文件
	private static final String CONFIG_FILE = "loadFile_loadXmlFile.xml";
	
	//dom4j 对象
	private Document document=null;
	
	//IP地址
	private String ip = null;
	//端口号
	private String port = null;
	//重启加载配置文件周期,默认值:12,单位:小时
	private int reloadTime=12;
	//告警级别转换
	private Map<String, String> alarmLevelsMap=new HashMap<String, String>();
	//工单状态数据转换
	private Map<String, String> sheetStatusTransMap=new HashMap<String, String>();
	
	
	/////////////////////////////////////////////	单例模式 start	/////////////////////////////////////////////
	/**
	 * 私有化构造方法
	 */
	private LoadXmlFile_dom4j(){
		log.info("加载配置文件: "+CONFIG_FILE);
		loadConfig();
		
		//开启定时加载配置文件的线程
		Thread reloadConfFile = new Thread(new ReloadConfFile());
		reloadConfFile.start();
	}

	/**
	 * 内部静态类,实例化本类对象
	 * @author wjq
	 *
	 */
	public static class ClassInstance{
		//在内部静态类中实例化LoadXmlFile对象
		private static final LoadXmlFile_dom4j instance=new LoadXmlFile_dom4j();
	}
	
	/**
	 * 对外提供本类实例化对象
	 * @return
	 */
	public static LoadXmlFile_dom4j getInstance(){
		return ClassInstance.instance;
	}
	/////////////////////////////////////////////	单例模式 end	/////////////////////////////////////////////
	
	

	/**
     * 加载配置文件信息
     */
    private void loadConfig() {
    	try {
    		InputStream inputStream = LoadXmlFile_dom4j.class.getResourceAsStream("/project/"+CONFIG_FILE);
        	if(inputStream!=null){
    			SAXReader saxReader=new SAXReader();
    			this.document=saxReader.read(inputStream);
    			if(document==null){
    				return;
    			}
    			
    			this.ip=loadSingleNode("config/myProject/ip");
    			this.port=loadSingleNode("config/myProject/port");
    			this.reloadTime=Integer.valueOf(loadSingleNode("config/myProject/reloadTime"));
    			this.alarmLevelsMap=loadAttributeMap("config/myProject/alarmLevels");
    			this.sheetStatusTransMap=loadTextMap("config/myProject/sheetStatusTrans");
        	}else{
        		log.error("配置文件不存在,请确认已经将配置文件["+CONFIG_FILE+"]已经放在[project]目录下");
        	}
		} catch (Exception e) {
			log.error("解析配置文件["+CONFIG_FILE+"]异常",e);
		}
    }
    
    /**
	 * ReloadConfFile thread
	 * 定时重新加载xml配置文件 线程
	 * 默认每隔12小时加载一次xml配置文件,
	 * @author wjq
	 */
	private class ReloadConfFile implements Runnable {
		public void run() {
			// TODO Auto-generated method stub
			while(true) {
				try {
					Thread.sleep(reloadTime*60*60*1000);
				} catch (InterruptedException e) {
				}
				log.info("重新加载配置文件:"+CONFIG_FILE);
				loadConfig();
			}
		}
	}
	
    
    /**
     * 获取单个节点的文本值
     * @param nodePath
     * @return
     */
    private String loadSingleNode(String nodePath){
    	Element element=(Element)document.selectSingleNode(nodePath);
    	String nodeText=element.getTextTrim();
    	log.info(element.getName()+"="+nodeText);
    	return nodeText;
    }
    
    /**
     * 加载from、to在元素属性节点上的转换关系
     * from为key、to为value
     * @param nodePath 节点路径
     * @return
     */
	private Map<String, String> loadAttributeMap(String nodePath){
		Map<String, String> fromToMap=new HashMap<String, String>();
		//日志信息
		String logMessage="";
		
		//先清空Map内容
		fromToMap.clear();
		Element element=(Element) document.selectSingleNode(nodePath);
		logMessage=element.getName()+":[";
		
		List elementList =element.elements();
		Iterator iter=elementList.iterator();
		while(iter.hasNext()) {
			Element el=(Element)iter.next();
			String key= el.attributeValue("from").trim();
			String value= el.attributeValue("to").trim();
			fromToMap.put(key, value);
			logMessage=logMessage+";from="+key+",to="+value;
		}
		
		logMessage=logMessage.replaceFirst(";", "")+"]";
		log.info(logMessage);
		
		return fromToMap;
	}
	
	/**
	 * 加载from、to为单独元素的转换关系
	 * from为key、to为value
	 * @param nodePath 节点路径
	 * @return
	 */
	private Map<String, String> loadTextMap(String nodePath){
		Map<String, String> fromToMap=new HashMap<String, String>();
		//日志信息
		String logMessage="";
		
		//先清空Map内容
		fromToMap.clear();
		Element element=(Element) document.selectSingleNode(nodePath);
		logMessage=element.getName()+":[";
		
		List elementList =element.elements();
		Iterator iter=elementList.iterator();
		while(iter.hasNext()) {
			Element el=(Element)iter.next();
			String key= el.element("from").getTextTrim();
			String value= el.element("to").getTextTrim();
			logMessage=logMessage+";from="+key+",to="+value;
		}
		
		logMessage=logMessage.replaceFirst(";", "")+"]";
		log.info(logMessage);
		
		return fromToMap;
	}
    

	public String getIp() {
		return ip;
	}

	public void setIp(String ip) {
		this.ip = ip;
	}

	public String getPort() {
		return port;
	}
	public void setPort(String port) {
		this.port = port;
	}

	public Map<String, String> getAlarmLevelsMap() {
		return alarmLevelsMap;
	}

	public void setAlarmLevelsMap(Map<String, String> alarmLevelsMap) {
		this.alarmLevelsMap = alarmLevelsMap;
	}

	public Map<String, String> getSheetStatusTransMap() {
		return sheetStatusTransMap;
	}

	public void setSheetStatusTransMap(Map<String, String> sheetStatusTransMap) {
		this.sheetStatusTransMap = sheetStatusTransMap;
	}


	/**
	 * @param args
	 */
	public static void main(String[] args) {
		LoadXmlFile_dom4j loadXmlFile=LoadXmlFile_dom4j.getInstance();
	}
}

 

配置文件:

<?xml version="1.0" encoding="Gb2312"?>
<config>
	<myProject>
		<!-- IP地址 -->
		<ip>127.0.0.1</ip>
		<!-- 端口号 -->
		<port>51088</port>

		<!-- 第一种数据转换方法  from为key、to为value-->
		<alarmLevels>
			<level from="紧急告警" to="1" />
			<level from="重要告警" to="2" />
			<level from="次要告警" to="3" />
			<level from="警告告警" to="4" />
		</alarmLevels>

		<!-- 第二种数据转换方法  from为key、to为value-->
		<sheetStatusTrans>
			<sheetStatusRecord>
				<from>草稿</from><to>1</to>
			</sheetStatusRecord>
			<sheetStatusRecord>
				<from>一级处理中</from><to>2</to>
			</sheetStatusRecord>
			<sheetStatusRecord>
				<from>二级处理中</from><to>3</to>
			</sheetStatusRecord>
			<sheetStatusRecord>
				<from>三级处理中</from><to>4</to>
			</sheetStatusRecord>
		</sheetStatusTrans>
		
		<!-- 重新读取配置文件周期,默认值:12,单位:小时 -->
		<reloadTime>12</reloadTime>
	</myProject>
</config>

 

 

0
0
分享到:
评论

相关推荐

    JAVA XML dom4j-1.6.1

    Spring使用dom4j解析XML,创建并初始化Bean实例。 9. **性能与效率** - 虽然DOM4J是基于DOM的,但它对DOM进行了优化,减少了内存消耗,提高了处理速度,特别是在读写大型XML文档时,性能优于标准DOM API。 10. **...

    dom4j解析xml文件代码示例

    在`CacheInit.java`这个示例中,可能包含了利用DOM4J解析`emailTemplateConfig.xml`文件,提取或修改其中的配置信息,以初始化缓存或其他系统设置的逻辑。通过上述步骤,你可以理解并实现类似的功能。

    DOM4J读取XML

    在深入探讨如何使用DOM4J库来解析XML文件之前,我们先简要了解DOM4J的基本概念及其在Java开发环境中的重要性。DOM4J是一个轻量级、高性能且易于使用的Java库,用于处理XML文档。它提供了类似于DOM、SAX和JDOM的API,...

    java使用dom4j解析xml配置文件实现抽象工厂反射示例

    总结起来,这个示例展示了如何在Java中利用DOM4J解析XML配置文件,结合抽象工厂模式和反射机制来创建和管理对象。这样的设计允许开发者在不修改代码的情况下,通过调整配置文件就能改变系统的运行行为,提高了软件的...

    dom4j完整包下载

    Spring框架大量使用了DOM4J进行XML配置文件的解析和处理,使得我们可以用直观的XML格式定义bean的依赖关系和行为。 首先,DOM4J的核心功能之一是DOM(Document Object Model)模型的构建。DOM是一种树形结构,用于...

    dom4j解析xml

    1. **初始化解析器**:首先,我们需要导入dom4j的相关库,并创建一个SAXReader对象,它是DOM4J提供的解析器,用于读取XML文件。 ```java import org.dom4j.Document; import org.dom4j.DocumentException; import ...

    使用Fusion Charts制作报表(dom4j生成XML)

    1. **初始化XML文档结构**:使用DOM4J的`Document`类创建一个新的XML文档实例。然后添加根元素,例如`chart`,表示图表的容器。 2. **添加图表属性**:在根元素下,可以添加各种属性节点,如`caption`、`subCaption...

    dom4j+反射机制

    例如,在Spring框架中,XML配置文件被解析为DOM4J的Document对象,然后通过反射机制创建并初始化bean。 当解析到一个bean定义时,Spring会使用反射找到对应的类并创建实例。如果bean定义包含属性注入,Spring会通过...

    DOM4J_SAX_DOM_XML的实例

    每个示例通常会包含初始化解析器、注册事件处理器(对于SAX)、构建XML文档对象(对于DOM)或使用DOM4J API来读取和修改XML内容的步骤。 总的来说,理解和掌握DOM4J、SAX和DOM对于任何涉及XML处理的Java开发人员来...

    xml文件的配置读取工具类

    4. **SysConfigUtil.java**:与`SystemConfig.java`类似,这个类可能是一个系统配置的通用工具类,提供了对XML配置文件的便利操作。它可能包含一些辅助方法,如读取特定配置项、验证配置值等,以简化开发者的代码。 ...

    dom4j参考资料

    DOM4j是一种广泛应用于Java项目的高效、强大且易于使用的XML API。作为开源软件,DOM4j在SourceForge等平台上可免费获取,并因其在性能、功能和易用性方面的卓越表现而备受推崇。尤其值得一提的是,DOM4j不仅被众多...

    Java通过XML Schema校验XML

    在本例中,作者选择使用DOM4j库来进行XML的解析与校验,并且结合了javax.xml.parsers包中的SAXParser来实现XML与XSD之间的校验。这种方法相对直观且易于理解。 #### 示例代码详解 首先,我们来看一下示例中给出的...

    DWR.xml配置文件说明

    ### DWR.xml配置文件详解 #### 一、DWR配置文件结构与作用 DWR(Direct Web Remoting)是一个开源的Ajax框架,它允许在浏览器端JavaScript代码直接调用服务器端Java方法,从而简化了传统的AJAX编程。DWR.xml是DWR...

    dom4jfull.jar

    DOM4Jfull.jar的使用方法基本与dom4j.jar一致,但在初始化解析器时,可以通过配置选择使用Alfred2。例如,可以通过以下代码片段指定解析器: ```java DocumentFactory factory = DocumentFactory.getInstance(); ...

    Android Dom解析XML

    在Android开发中,XML文件常用于存储数据或配置信息,如布局文件、资源文件等。本文将深入探讨如何使用DOM(Document Object Model)解析XML在Android应用中的实践。DOM解析方式允许开发者一次性加载整个XML文档到...

    解析web-config.xml文件,并将里面的元素转换成对应的JAVA对象

    在Java Web开发中,`web-config.xml`是应用的核心配置文件,它定义了Servlet、过滤器、监听器、会话超时、MVC框架的配置等关键信息。这个过程通常涉及XML解析和Java对象映射,是理解Web应用程序运行机制的关键部分。...

    经典XML处理实例采用DOM处理模式

    在Java中,可以使用`javax.xml.parsers.DocumentBuilderFactory`和`javax.xml.parsers.DocumentBuilder`类来创建和初始化解析器。 2. **创建DOM树**:解析器读取XML文件后,会生成一个`org.w3c.dom.Document`对象,...

    基于java的转换xml.zip

    在Java中处理XML,我们可以使用多种库和API,如JAXB (Java Architecture for XML Binding),DOM (Document Object Model),SAX (Simple API for XML) 和StAX (Streaming API for XML)。但根据提供的文件名"XStream-...

    dom4jAPI帮助文档

    - **Web开发**: 在Servlet或Spring MVC中,DOM4J用于处理XML配置文件或接收XML请求数据。 - **数据交换**: 在分布式系统间,XML作为数据交换格式,DOM4J提供解析和生成XML的能力。 - **XML配置文件读写**: 处理如...

Global site tag (gtag.js) - Google Analytics