根據不一樣省份讀取配置文件

       有時候咱們會遇到一套管理系統代碼部署到不一樣省份,不一樣省份的又要有不一樣的需求,這時候咱們就要考慮在配置文件中使用些參數來控制 代碼裏面的某些功能的開關java

獲取maven項目resource路徑dom

//Constants 爲這個變量所在類的名稱
public static final String resourcePaths =Constants.class.getClassLoader()
.getResource("").getPath();

咱們來看看代碼是怎麼實現的 配置文件裏面內容是鍵值對的形式 因此咱們用一個hashMap來存儲單個配置maven

文件裏面的內容 有多個配置文件 因此咱們考慮構造一個雙重Map code

private static Map<String, Map<String, Object>> confirParamMap 
= new HashMap<String,Map<String,Object>>();

 

怎樣解析單個XML中的內容到mapxml

<?xml version="1.0" encoding="UTF-8"?>
<config>
	<!--admin門戶的地址,絕對地址-->
	<adminPath>/admin</adminPath>
	<!-- 企業用戶角色ID(已認證) -->
	<staffIdRoles>7</staffIdRoles>
	<!--用戶角色ID(已認證) -->
	
</config>

咱們用dom4j解析XMLelement

針對上面的XML文件咱們要獲取的數據是一個 Element元素組成的集合文檔

因此咱們構造這樣一個方法 傳入參數是一個 List<Element> 返回一個 Map集合部署

private static Map<String, Object> getAllElements(List<Element> childElements, Map<String, Object> mapEle) {
		for (Element ele : childElements) {
		mapEle.put(ele.getName(), ele.getText());
			if (ele.elements().size() > 0) {
			
				mapEle = getAllElements(ele.elements(), mapEle);
			}
		}
		return mapEle;
	}

讀取config.properties下的默認省份get

public class propertyUtil {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
         readProperty(Constants.resourcePaths+"config/config.properties");
	}
    public static Map<String,Object> readProperty(String filePath){
	 Properties prop = new Properties();   
	 Map<String,Object> map = new HashMap<String,Object>();
		    try{
		      //讀取屬性文件a.properties
		     InputStream in = new BufferedInputStream (new FileInputStream(filePath));
		     prop.load(in);     ///加載屬性列表
	         Iterator<String> it=prop.stringPropertyNames().iterator();
	         while(it.hasNext()){
		        String key=it.next();
	            System.out.println(key+":"+prop.getProperty(key));
	            map.put(key, prop.getProperty(key));
		     }
		      in.close();
		         return map;
		     }
		    catch(Exception e){
		        	 return map;
		     }
			
	}

}

 

讀取function 下配置文件(notifyContent.xml,system.xml) 先讀取最外層默認的配置文件 再讀取當前省份配置文件,並獲取他們的節點string

private static void initMap(String filePath) {// 獲取某個目錄下的配置文件
		File configurefile = new File(filePath);
		File[] files = configurefile.listFiles();
		for (File file : files) {// 目錄下面幾個XML文件
			if (!file.isDirectory()) {
				String fileName = file.getName();
			    String[] fileNameList = fileName.split("\\.");//點號須要轉義才能分割
					
				SAXReader reader = new SAXReader();
				Document document = null;
				try {
					document = reader.read(file);
				} catch (DocumentException e) {
					// TODO Auto-generated catch block
					System.out.println("讀取文件失敗");
					e.printStackTrace();
				}
                //讀取XML根節點
				Element root = document.getRootElement();
				// 根節點下面的因此子節點
                //也就是 <!--admin門戶的地址,絕對地址-->
	                      <adminPath>/admin</adminPath>
	                      <!-- 企業用戶角色ID(已認證) -->
	                           <staffIdRoles>7</staffIdRoles>
	                      <!--用戶角色ID(已認證) -->
				List<Element> childElements = root.elements();
				Map<String, Object> mapEle = new HashMap<String, Object>();
				// 遍歷子節點
				mapEle = getAllElements(childElements, mapEle);
                if(confirParamMap.containsKey(fileNameList[0])){
                	//好比如今獲取12 目錄下面的system.xml 以前已經把外層的system.xml讀進去了
                	 for (Entry<String, Object> entry : mapEle.entrySet()) {
          			  
          			 confirParamMap.get(fileNameList[0]).put(entry.getKey(), entry.getValue());
          			  }
                	
                }else{
    				confirParamMap.put(fileNameList[0], mapEle);
                }

			}

		}

	}

這樣咱們在這個類初始化時就調用方法initMap就能將配置文件裏面的內容放到雙重map裏面去了

現附上整個代碼

package com.dlh.test;

import java.io.File;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import com.dlh.common.util.Constants;

public class xmlParseSingleton {

	private static Map<String, Map<String, Object>> confirParamMap = new HashMap<String, Map<String,Object>>();
    
	public static Map<String, Map<String, Object>> getConfirParamMap() {
		return confirParamMap;
	}

	
	private xmlParseSingleton() {
		System.out.println("初始化");

	}

	private static class innerClass {
		public static final xmlParseSingleton instance = new xmlParseSingleton();

	}

	public static xmlParseSingleton getInstance() {

		return innerClass.instance;
	}

	static {
		initMap(Constants.resourcePaths + "config/function/");
		Map<String,Object> propMap =propertyUtil.readProperty(Constants.resourcePaths+"config/config.properties");
		initMap(Constants.resourcePaths + "config/function/"+propMap.get("DEFAULT_PROVINCE"));
	}

	//
	private static void initMap(String filePath) {// 獲取某個目錄下的配置文件
		File configurefile = new File(filePath);
		File[] files = configurefile.listFiles();
		for (File file : files) {// 目錄下面幾個XML文件
			if (!file.isDirectory()) {
				String fileName = file.getName();
			    String[] fileNameList = fileName.split("\\.");//點號須要轉義才能分割
					
				SAXReader reader = new SAXReader();
				Document document = null;
				try {
					document = reader.read(file);
				} catch (DocumentException e) {
					// TODO Auto-generated catch block
					System.out.println("讀取文件失敗");
					e.printStackTrace();
				}
				Element root = document.getRootElement();
				// 子節點
				List<Element> childElements = root.elements();
				Map<String, Object> mapEle = new HashMap<String, Object>();
				// 遍歷子節點
				mapEle = getAllElements(childElements, mapEle);
                if(confirParamMap.containsKey(fileNameList[0])){
                	//好比如今獲取12 目錄下面的system.xml 以前已經把外層的system.xml讀進去了
                	 for (Entry<String, Object> entry : mapEle.entrySet()) {
          			  
          			 confirParamMap.get(fileNameList[0]).put(entry.getKey(), entry.getValue());
          			  }
                	
                }else{
    				confirParamMap.put(fileNameList[0], mapEle);
                }

			}

		}

	}

	private static Map<String, Object> getAllElements(List<Element> childElements, Map<String, Object> mapEle) {
		for (Element ele : childElements) {
		/*	System.out.println("key:" + ele.getName());
			System.out.println("value:" + ele.getText());*/
			mapEle.put(ele.getName(), ele.getText());
			if (ele.elements().size() > 0) {
			
				mapEle = getAllElements(ele.elements(), mapEle);
			}
		}
		return mapEle;
	}

	public static void main(String[] args) {
		
		System.out.println(	confirParamMap.get("system").size());
		
		
		
	}
}

這裏的xml文檔的格式比較簡單 其實均可以用properties代替

相關文章
相關標籤/搜索