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