2013-08-30 185 views
1

我的目標是Java 1.5的 我從其他軟件提供商提供我需要閱讀它解析自定義XML配置文件

<?xml version="1.0" encoding="ISO-8859-1"?> 
<environments> 
    <environment key="DEFAULT" description="Default"> 
     <variable name="LOGGER_NAME" value="LCI"/> 
     <variable name="MAIL_SERVER" value="127.0.0.1"/> 
      ...... 
    </environment> 
    <environment key="TEST" description="Test"> 
     <variable name="LOGGER_NAME" value="LCO"/> 
     <variable name="MAIL_SERVER" value="192.168.2.15"/> 
      ...... 
    </environment> 
</environments> 

我需要把它放在一個哈希表,並查看在其自定義配置文件如。

MyPropertyManager.getProperty( 「默認」, 「LOGGER_NAME」)

我認爲我可以在一個HashMap,我可以像存取權限DEFAULT.LOGGER_NAME

usingg關鍵負載的相關信息

我可以使用Apache Commons Configuration也(如何?)還是太複雜,最好使用Xpath?

回答

1

短配置文件的最佳解決方案是構建散列映射。

XPathFactory xPathfactory = XPathFactory.newInstance(); 
      XPath xpath = xPathfactory.newXPath(); 
      XPathExpression expr1 = xpath.compile("/environments/environment"); 
      XPathExpression expr2 = xpath.compile("@key"); 
      XPathExpression expr12 = xpath.compile("variable"); 
      XPathExpression expr121 = xpath.compile("@name"); 
      XPathExpression expr122 = xpath.compile("@value"); 

      NodeList environmentNL = (NodeList) expr1.evaluate(doc, XPathConstants.NODESET); 
      for (int i = 0; i < environmentNL.getLength(); i++) { 
       Node environmentI = environmentNL.item(i); 
       String envKey = (String) expr2.evaluate(environmentI, XPathConstants.STRING); 


       NodeList variableNL = (NodeList) expr12.evaluate(environmentI, XPathConstants.NODESET); 
       for (int j = 0; j < variableNL.getLength(); j++) { 
        Node variableI = variableNL.item(j); 
        String valueName = (String) expr121.evaluate(variableI, XPathConstants.STRING); 
        String valueValue = (String) expr122.evaluate(variableI, XPathConstants.STRING); 

        val.put(envKey+"."+valueName, valueValue); 

       } 
      } 

並添加兩個方法 在這種情況下,我使用變量的命名空間,而不是環境

1)在這種情況下

public static String getProperties(String namespace, String value) throws ConfigLoaderException { 
     String param=namespace+"."+value; 

     if(!val.containsKey(param)){ 
      throw new ConfigLoaderException(param+" ERROR"); 
     }else{ 
      return val.get(param); 

     } 
    } 

...

public static String getProperties(String value) throws ConfigLoaderException { 
     String namespace="DEFAULT"; 
     return getProperties(namespace,value); 
    }