溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Apache Commons Configuration讀取xml配置的方法

發(fā)布時(shí)間:2020-10-30 11:41:54 來源:億速云 閱讀:246 作者:小新 欄目:編程語言

這篇文章將為大家詳細(xì)講解有關(guān)Apache Commons Configuration讀取xml配置的方法,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

近期項(xiàng)目自己手寫一個(gè)字符串連接池。因?yàn)榄h(huán)境不同有開發(fā)版本、測試版本、上線版本、每一個(gè)版本用到的數(shù)據(jù)庫也是不一樣的。所以需要能靈活的切換數(shù)據(jù)庫連接。當(dāng)然這個(gè)用maven就解決了。Apache Commons Configuration 框架用的主要是解析數(shù)據(jù)庫連接字符串。
下面介紹Apache Commons Configuration 框架的常用部分。

1)Apache Commons Configuration framework框架使用

**

  • 下載jar包http://www.php.cn/或者h(yuǎn)ttp://www.php.cn/ maven中搜索下載

  • 研究api的使用。

使用好處

  • ·當(dāng)xml結(jié)構(gòu)大變化的時(shí)候不用過多的修改解析xml的代碼

  • 用戶只需要修改自己的解析語法樹即可。

  • 客戶只需要修改語法樹框架去解析,思考的起點(diǎn)是不是跟設(shè)計(jì)模式中的解釋器模式類似。構(gòu)建抽象語法樹并解釋執(zhí)行。

  • 用戶只需要關(guān)心和修改自己的解析語法樹即可。

  • 用戶不用關(guān)系如何解析只需要配置對(duì)應(yīng)的解析語法規(guī)則即可。

  • 簡化程序xml配置結(jié)構(gòu)變化后大幅度的修改代碼。

    首先先配置一下Maven。

 <dependency>
        <groupId>commons-configuration</groupId>
        <artifactId>commons-configuration</artifactId>
        <version>1.8</version>
    </dependency>
    <dependency>
        <groupId>commons-beanutils</groupId>
        <artifactId>commons-beanutils</artifactId>
        <version>1.8.0</version>
    </dependency>
    <dependency>
        <groupId>commons-jxpath</groupId>
        <artifactId>commons-jxpath</artifactId>
        <version>1.3</version>
    </dependency>

定義一個(gè)springok1.xml內(nèi)容如下
Apache Commons Configuration讀取xml配置的方法

<?xml version="1.0" encoding="UTF-8"?><!-- springok1.xml --><config>
    <database>
        <url>127.0.0.1</url>
        <port>3306</port>
        <login>admin</login>
        <password></password>
    </database></config>

解析代碼開始了

public static void main(String[] args) throws Exception {
        XMLConfiguration conf=new XMLConfiguration("springok1.xml");
        System.out.println(conf.getString("database.url"));
        System.out.println(conf.getString("database.port"));
        System.out.println(conf.getString("database.login"));
        System.out.println(conf.getString("database.password"));
    }

輸出如下:說明已經(jīng)成功解析xml了。
127.0.0.1
3306
admin
獲取的方法有很多種更詳細(xì)的獲取方法可以從AbstractConfiguration方法中對(duì)應(yīng)找到。
上面配置的是一個(gè)數(shù)據(jù)庫的連接信息,如果配置很多數(shù)據(jù)庫的連接信息,怎么解析連接信息切換呢。修改springok1.xml的信息為多個(gè)連接配置如下:

<?xml version="1.0" encoding="UTF-8"?><!-- springok1.xml --><config><databases>
    <database>
        <url>127.0.0.1</url>
        <port>3306</port>
        <login>admin</login>
        <password></password>
    </database>
    <database>
        <url>127.0.0.1</url>
        <port>3302</port>
        <login>admin</login>
        <password>admin</password>
    </database></databases></config>

現(xiàn)在假設(shè)我們要獲取兩個(gè)的配置數(shù)據(jù)庫連接信息,程序如下:

    public static void main(String[] args) throws Exception {
        XMLConfiguration conf=new XMLConfiguration("springok1.xml");
        System.out.println(conf.getString("databases.database(0).url"));
        System.out.println(conf.getString("databases.database(0).port"));
        System.out.println(conf.getString("databases.database(0).login"));
        System.out.println(conf.getString("databases.database(0).password"));
        System.out.println(conf.getString("databases.database(1).url"));
        System.out.println(conf.getString("databases.database(1).port"));
        System.out.println(conf.getString("databases.database(1).login"));
        System.out.println(conf.getString("databases.database(1).password"));
    }

輸出:
127.0.0.1
3306
admin

127.0.0.1
3302
admin
admin

解析ok,
結(jié)合前面的配置文件的例子跟實(shí)戰(zhàn)我們發(fā)現(xiàn)多個(gè)相同的標(biāo)簽的話索引是從0開始的。

XPath表達(dá)式使用

點(diǎn)的訪問方式上面的那種方式是沒問題,對(duì)于一些復(fù)雜的配置來講,我們可能需要使用XPath表達(dá)式語言。這里的主要優(yōu)點(diǎn)是,使用了XML的高級(jí)查詢,程序看起來仍然比較簡潔易懂??衫斫庑愿摺?
Apache Commons Configuration讀取xml配置的方法
 還是解析上面的springok.xml文件。代碼如下:

  XMLConfiguration conf=new XMLConfiguration("springok1.xml");
        conf.setExpressionEngine(new XPathExpressionEngine());
        System.out.println(conf.getString("databases/database[port='3306']/url"));
        System.out.println(conf.getString("databases/database[port='3302']/port"));

輸出:
127.0.0.1
3302
測試ok.

訪問環(huán)境變量

EnvironmentConfiguration conf=new EnvironmentConfiguration();
        System.out.println(conf.getMap());

源碼分析如何實(shí)現(xiàn):

public EnvironmentConfiguration()
    {        super(new HashMap<String, Object>(System.getenv()));
    }

聯(lián)合配置

聯(lián)合一和2兩種方式,是不是我們可以再系統(tǒng)變量中定義一個(gè)需要連接的數(shù)據(jù)庫字符串key,解析的時(shí)候獲取動(dòng)態(tài)加載呢?

public String getDbUrl() throws ConfigurationException {
    EnvironmentConfiguration envConfig =new EnvironmentConfiguration();    String env = envConfig.getString("ENV_TYPE");    if("dev".equals(env) ||"production".equals(env)) {
        XMLConfiguration xmlConfig =new XMLConfiguration("springok1.xml");
        xmlConfig.setExpressionEngine(new XPathExpressionEngine());        String xpath ="databases/database[name = '"+ env +"']/url";        return xmlConfig.getString(xpath);
    }else{        String msg ="ENV_TYPE environment variable is "+
                     "not properly set";
        throw new IllegalStateException(msg);
    }
}

測試ok沒問題。

統(tǒng)一管理模塊化

xml配置如下圖:

Apache Commons Configuration讀取xml配置的方法
public String getDbUrl()throws ConfigurationException {
   DefaultConfigurationBuilder builder =
       new DefaultConfigurationBuilder(“config.xml”);
   boolean load =true;
   CombinedConfiguration config = builder.getConfiguration(load);
   config.setExpressionEngine(new XPathExpressionEngine());
   String env = config.getString(“ENV_TYPE”);
   if(“dev”.equals(env) ||”production”.equals(env)) {
       String xpath =”databases/database[name = ‘”+ env +”’]/url”;
       return config.getString(xpath);
   }else{
       String msg =”ENV_TYPE environment variable is “+
                    “not properly set”;
       throw new IllegalStateException(msg);
   }
}

自動(dòng)重新加載

當(dāng)基于文件的配置變化的時(shí)候自動(dòng)加載,因?yàn)槲覀兛梢栽O(shè)置加載策略。框架會(huì)輪詢配置文件,當(dāng)文件的內(nèi)容發(fā)生改變時(shí),配置對(duì)象也會(huì)刷新。你可以用程序控制:

    XMLConfiguration config =new XMLConfiguration("springok1.xml");
        ReloadingStrategy strategy =new FileChangedReloadingStrategy();
        ((FileChangedReloadingStrategy) strategy).setRefreshDelay(5000);
        config.setReloadingStrategy(strategy);

或者配置的時(shí)候控制:

<?xmlversion="1.0"encoding="UTF-8"?><!-- config.xml --><configuration>
  <env/>
  <xmlfileName="const.xml">
    <reloadingStrategyrefreshDelay="5000"      config-class="org.apache.commons.configuration.reloading.FileChangedReloadingStrategy"/>
  </xml></configuration>

下面是dom和sax方式的手動(dòng)解析方式可參考使用。
java語言中xml解析有很多種方式,最流行的方式有sax和dom兩種。
1. dom是把所有的解析內(nèi)容一次性加入內(nèi)存所以xml內(nèi)容大的話性能不好。
2. sax是驅(qū)動(dòng)解析。所以內(nèi)存不會(huì)占用太多。(spring用的就是sax解析方式)

需要什么包自己到網(wǎng)上找下吧?
xml文件如下:

<?xml version="1.0" encoding="GB2312"?> 
<RESULT> 
<VALUE> 
   <NO>springok1</NO> 
   <ADDR>springok</ADDR> 
</VALUE> 
<VALUE> 
   <NO>springok2</NO> 
  ?。糀DDR>springok</ADDR> 
</VALUE> 
</RESULT>

1)DOM(JAXP Crimson解析器)

DOM是用與平臺(tái)和語言無關(guān)的方式表示XML文檔的官方W3C標(biāo)準(zhǔn)。DOM是以層次結(jié)構(gòu)組織的節(jié)點(diǎn)或信息片斷的集合。這個(gè)層次結(jié)構(gòu)允許開發(fā)人員在樹中尋找特定信息。分析該結(jié)構(gòu)通常需要加載整個(gè)文檔和構(gòu)造層次結(jié)構(gòu),然后才能做任何工作。由于它是基于信息層次的,因而DOM被認(rèn)為是基于樹或基于對(duì)象的。DOM以及廣義的基于樹的處理具有幾個(gè)優(yōu)點(diǎn)。首先,由于樹在內(nèi)存中是持久的,因此可以修改它以便應(yīng)用程序能對(duì)數(shù)據(jù)和結(jié)構(gòu)作出更改。它還可以在任何時(shí)候在樹中上下導(dǎo)航,而不是像SAX那樣是一次性的處理。DOM使用起來也要簡單得多。
import java.io.*; import java.util.*; import org.w3c.dom.*; import javax.xml.parsers.*; public class MyXMLReader{ 
 public static void main(String arge[]){ 

  long lasting =System.currentTimeMillis();   try{ 
   File f=new File("data_10k.xml");    DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();    DocumentBuilder builder=factory.newDocumentBuilder();    Document doc = builder.parse(f);    NodeList nl = doc.getElementsByTagName("VALUE");    for (int i=0;i<nl.getLength();i++){     System.out.print("車牌號(hào)碼:" + doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue());     System.out.println("車主地址:" + doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue());    } 
  }catch(Exception e){ 
   e.printStackTrace(); }

2)SAX

SAX處理的優(yōu)點(diǎn)非常類似于流媒體的優(yōu)點(diǎn)。分析能夠立即開始,而不是等待所有的數(shù)據(jù)被處理。而且,由于應(yīng)用程序只是在讀取數(shù)據(jù)時(shí)檢查數(shù)據(jù),因此不需要將數(shù)據(jù)存儲(chǔ)在內(nèi)存中。這對(duì)于大型文檔來說是個(gè)巨大的優(yōu)點(diǎn)。事實(shí)上,應(yīng)用程序甚至不必解析整個(gè)文檔;它可以在某個(gè)條件得到滿足時(shí)停止解析。一般來說,SAX還比它的替代者DOM快許多。

選擇DOM還是選擇SAX? 對(duì)于需要自己編寫代碼來處理XML文檔的開發(fā)人員來說, 選擇DOM還是SAX解析模型是一個(gè)非常重要的設(shè)計(jì)決策。 DOM采用建立樹形結(jié)構(gòu)的方式訪問XML文檔,而SAX采用的事件模型。

DOM解析器把XML文檔轉(zhuǎn)化為一個(gè)包含其內(nèi)容的樹,并可以對(duì)樹進(jìn)行遍歷。用DOM解析模型的優(yōu)點(diǎn)是編程容易,開發(fā)人員只需要調(diào)用建樹的指令,然后利用navigation APIs訪問所需的樹節(jié)點(diǎn)來完成任務(wù)。可以很容易的添加和修改樹中的元素。然而由于使用DOM解析器的時(shí)候需要處理整個(gè)XML文檔,所以對(duì)性能和內(nèi)存的要求比較高,尤其是遇到很大的XML文件的時(shí)候。由于它的遍歷能力,DOM解析器常用于XML文檔需要頻繁的改變的服務(wù)中。

SAX解析器采用了基于事件的模型,它在解析XML文檔的時(shí)候可以觸發(fā)一系列的事件,當(dāng)發(fā)現(xiàn)給定的tag的時(shí)候,它可以激活一個(gè)回調(diào)方法,告訴該方法制定的標(biāo)簽已經(jīng)找到。SAX對(duì)內(nèi)存的要求通常會(huì)比較低,因?yàn)樗岄_發(fā)人員自己來決定所要處理的tag.特別是當(dāng)開發(fā)人員只需要處理文檔中所包含的部分?jǐn)?shù)據(jù)時(shí),SAX這種擴(kuò)展能力得到了更好的體現(xiàn)。但用SAX解析器的時(shí)候編碼工作會(huì)比較困難,而且很難同時(shí)訪問同一個(gè)文檔中的多處不同數(shù)據(jù)。
import org.xml.sax.*; 
import org.xml.sax.helpers.*; 
import javax.xml.parsers.*; 

public class MyXMLReader extends DefaultHandler {  java.util.Stack tags = new java.util.Stack(); 
 public MyXMLReader() { 
  super(); 
} 

 public static void main(String args[]) { 
  long lasting = System.currentTimeMillis(); 
  try { 
   SAXParserFactory sf = SAXParserFactory.newInstance(); 
   SAXParser sp = sf.newSAXParser(); 
   MyXMLReader reader = new MyXMLReader(); 
   sp.parse(new InputSource("data_10k.xml"), reader); 
  } catch (Exception e) { 
   e.printStackTrace(); 
  } 

  System.out.println("運(yùn)行時(shí)間:" + (System.currentTimeMillis() - lasting) + "毫秒");} 
  public void characters(char ch[], int start, int length) throws SAXException { 
  String tag = (String) tags.peek(); 
  if (tag.equals("NO")) { 
   System.out.print("車牌號(hào)碼:" + new String(ch, start, length)); 
} 
if (tag.equals("ADDR")) { 
  System.out.println("地址:" + new String(ch, start, length)); 
} 
} 

  public void startElement(String uri,String localName,String qName,Attributes attrs) { 
  tags.push(qName);} 
}

**

總結(jié):個(gè)人喜歡這個(gè)框架,支持定時(shí)刷新、xpath、import方式。

近期項(xiàng)目自己手寫一個(gè)字符串連接池。因?yàn)榄h(huán)境不同有開發(fā)版本、測試版本、上線版本、每一個(gè)版本用到的數(shù)據(jù)庫也是不一樣的。所以需要能靈活的切換數(shù)據(jù)庫連接。當(dāng)然這個(gè)用maven就解決了。Apache Commons Configuration 框架用的主要是解析數(shù)據(jù)庫連接字符串。
下面介紹Apache Commons Configuration 框架的常用部分。

1)Apache Commons Configuration framework框架使用

**

  • 下載jar包http://www.php.cn/或者h(yuǎn)ttp://www.php.cn/ maven中搜索下載

  • 研究api的使用。

使用好處

  • ·當(dāng)xml結(jié)構(gòu)大變化的時(shí)候不用過多的修改解析xml的代碼

  • 用戶只需要修改自己的解析語法樹即可。

  • 客戶只需要修改語法樹框架去解析,思考的起點(diǎn)是不是跟設(shè)計(jì)模式中的解釋器模式類似。構(gòu)建抽象語法樹并解釋執(zhí)行。

  • 用戶只需要關(guān)心和修改自己的解析語法樹即可。

  • 用戶不用關(guān)系如何解析只需要配置對(duì)應(yīng)的解析語法規(guī)則即可。

  • 簡化程序xml配置結(jié)構(gòu)變化后大幅度的修改代碼。

    首先先配置一下Maven。

 <dependency>
        <groupId>commons-configuration</groupId>
        <artifactId>commons-configuration</artifactId>
        <version>1.8</version>
    </dependency>
    <dependency>
        <groupId>commons-beanutils</groupId>
        <artifactId>commons-beanutils</artifactId>
        <version>1.8.0</version>
    </dependency>
    <dependency>
        <groupId>commons-jxpath</groupId>
        <artifactId>commons-jxpath</artifactId>
        <version>1.3</version>
    </dependency>

定義一個(gè)springok1.xml內(nèi)容如下
Apache Commons Configuration讀取xml配置的方法

<?xml version="1.0" encoding="UTF-8"?><!-- springok1.xml --><config>
    <database>
        <url>127.0.0.1</url>
        <port>3306</port>
        <login>admin</login>
        <password></password>
    </database></config>

解析代碼開始了

public static void main(String[] args) throws Exception {
        XMLConfiguration conf=new XMLConfiguration("springok1.xml");
        System.out.println(conf.getString("database.url"));
        System.out.println(conf.getString("database.port"));
        System.out.println(conf.getString("database.login"));
        System.out.println(conf.getString("database.password"));
    }

輸出如下:說明已經(jīng)成功解析xml了。
127.0.0.1
3306
admin
獲取的方法有很多種更詳細(xì)的獲取方法可以從AbstractConfiguration方法中對(duì)應(yīng)找到。
上面配置的是一個(gè)數(shù)據(jù)庫的連接信息,如果配置很多數(shù)據(jù)庫的連接信息,怎么解析連接信息切換呢。修改springok1.xml的信息為多個(gè)連接配置如下:

<?xml version="1.0" encoding="UTF-8"?><!-- springok1.xml --><config><databases>
    <database>
        <url>127.0.0.1</url>
        <port>3306</port>
        <login>admin</login>
        <password></password>
    </database>
    <database>
        <url>127.0.0.1</url>
        <port>3302</port>
        <login>admin</login>
        <password>admin</password>
    </database></databases></config>

現(xiàn)在假設(shè)我們要獲取兩個(gè)的配置數(shù)據(jù)庫連接信息,程序如下:

    public static void main(String[] args) throws Exception {
        XMLConfiguration conf=new XMLConfiguration("springok1.xml");
        System.out.println(conf.getString("databases.database(0).url"));
        System.out.println(conf.getString("databases.database(0).port"));
        System.out.println(conf.getString("databases.database(0).login"));
        System.out.println(conf.getString("databases.database(0).password"));
        System.out.println(conf.getString("databases.database(1).url"));
        System.out.println(conf.getString("databases.database(1).port"));
        System.out.println(conf.getString("databases.database(1).login"));
        System.out.println(conf.getString("databases.database(1).password"));
    }

輸出:
127.0.0.1
3306
admin

127.0.0.1
3302
admin
admin

解析ok,
結(jié)合前面的配置文件的例子跟實(shí)戰(zhàn)我們發(fā)現(xiàn)多個(gè)相同的標(biāo)簽的話索引是從0開始的。

XPath表達(dá)式使用

點(diǎn)的訪問方式上面的那種方式是沒問題,對(duì)于一些復(fù)雜的配置來講,我們可能需要使用XPath表達(dá)式語言。這里的主要優(yōu)點(diǎn)是,使用了XML的高級(jí)查詢,程序看起來仍然比較簡潔易懂??衫斫庑愿?。
Apache Commons Configuration讀取xml配置的方法
 還是解析上面的springok.xml文件。代碼如下:

  XMLConfiguration conf=new XMLConfiguration("springok1.xml");
        conf.setExpressionEngine(new XPathExpressionEngine());
        System.out.println(conf.getString("databases/database[port='3306']/url"));
        System.out.println(conf.getString("databases/database[port='3302']/port"));

輸出:
127.0.0.1
3302
測試ok.

訪問環(huán)境變量

EnvironmentConfiguration conf=new EnvironmentConfiguration();
        System.out.println(conf.getMap());

源碼分析如何實(shí)現(xiàn):

public EnvironmentConfiguration()
    {        super(new HashMap<String, Object>(System.getenv()));
    }

聯(lián)合配置

聯(lián)合一和2兩種方式,是不是我們可以再系統(tǒng)變量中定義一個(gè)需要連接的數(shù)據(jù)庫字符串key,解析的時(shí)候獲取動(dòng)態(tài)加載呢?

public String getDbUrl() throws ConfigurationException {
    EnvironmentConfiguration envConfig =new EnvironmentConfiguration();    String env = envConfig.getString("ENV_TYPE");    if("dev".equals(env) ||"production".equals(env)) {
        XMLConfiguration xmlConfig =new XMLConfiguration("springok1.xml");
        xmlConfig.setExpressionEngine(new XPathExpressionEngine());        String xpath ="databases/database[name = '"+ env +"']/url";        return xmlConfig.getString(xpath);
    }else{        String msg ="ENV_TYPE environment variable is "+
                     "not properly set";
        throw new IllegalStateException(msg);
    }
}

測試ok沒問題。

統(tǒng)一管理模塊化

xml配置如下圖:

Apache Commons Configuration讀取xml配置的方法
public String getDbUrl()throws ConfigurationException {
   DefaultConfigurationBuilder builder =
       new DefaultConfigurationBuilder(“config.xml”);
   boolean load =true;
   CombinedConfiguration config = builder.getConfiguration(load);
   config.setExpressionEngine(new XPathExpressionEngine());
   String env = config.getString(“ENV_TYPE”);
   if(“dev”.equals(env) ||”production”.equals(env)) {
       String xpath =”databases/database[name = ‘”+ env +”’]/url”;
       return config.getString(xpath);
   }else{
       String msg =”ENV_TYPE environment variable is “+
                    “not properly set”;
       throw new IllegalStateException(msg);
   }
}

自動(dòng)重新加載

當(dāng)基于文件的配置變化的時(shí)候自動(dòng)加載,因?yàn)槲覀兛梢栽O(shè)置加載策略。框架會(huì)輪詢配置文件,當(dāng)文件的內(nèi)容發(fā)生改變時(shí),配置對(duì)象也會(huì)刷新。你可以用程序控制:

    XMLConfiguration config =new XMLConfiguration("springok1.xml");
        ReloadingStrategy strategy =new FileChangedReloadingStrategy();
        ((FileChangedReloadingStrategy) strategy).setRefreshDelay(5000);
        config.setReloadingStrategy(strategy);

或者配置的時(shí)候控制:

<?xmlversion="1.0"encoding="UTF-8"?><!-- config.xml --><configuration>
  <env/>
  <xmlfileName="const.xml">
    <reloadingStrategyrefreshDelay="5000"      config-class="org.apache.commons.configuration.reloading.FileChangedReloadingStrategy"/>
  </xml></configuration>

下面是dom和sax方式的手動(dòng)解析方式可參考使用。
java語言中xml解析有很多種方式,最流行的方式有sax和dom兩種。
1. dom是把所有的解析內(nèi)容一次性加入內(nèi)存所以xml內(nèi)容大的話性能不好。
2. sax是驅(qū)動(dòng)解析。所以內(nèi)存不會(huì)占用太多。(spring用的就是sax解析方式)

需要什么包自己到網(wǎng)上找下吧?
xml文件如下:

<?xml version="1.0" encoding="GB2312"?> 
<RESULT> 
<VALUE> 
   <NO>springok1</NO> 
   <ADDR>springok</ADDR> 
</VALUE> 
<VALUE> 
   <NO>springok2</NO> 
  ?。糀DDR>springok</ADDR> 
</VALUE> 
</RESULT>

1)DOM(JAXP Crimson解析器)

DOM是用與平臺(tái)和語言無關(guān)的方式表示XML文檔的官方W3C標(biāo)準(zhǔn)。DOM是以層次結(jié)構(gòu)組織的節(jié)點(diǎn)或信息片斷的集合。這個(gè)層次結(jié)構(gòu)允許開發(fā)人員在樹中尋找特定信息。分析該結(jié)構(gòu)通常需要加載整個(gè)文檔和構(gòu)造層次結(jié)構(gòu),然后才能做任何工作。由于它是基于信息層次的,因而DOM被認(rèn)為是基于樹或基于對(duì)象的。DOM以及廣義的基于樹的處理具有幾個(gè)優(yōu)點(diǎn)。首先,由于樹在內(nèi)存中是持久的,因此可以修改它以便應(yīng)用程序能對(duì)數(shù)據(jù)和結(jié)構(gòu)作出更改。它還可以在任何時(shí)候在樹中上下導(dǎo)航,而不是像SAX那樣是一次性的處理。DOM使用起來也要簡單得多。
import java.io.*; import java.util.*; import org.w3c.dom.*; import javax.xml.parsers.*; public class MyXMLReader{ 
 public static void main(String arge[]){ 

  long lasting =System.currentTimeMillis();   try{ 
   File f=new File("data_10k.xml");    DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();    DocumentBuilder builder=factory.newDocumentBuilder();    Document doc = builder.parse(f);    NodeList nl = doc.getElementsByTagName("VALUE");    for (int i=0;i<nl.getLength();i++){     System.out.print("車牌號(hào)碼:" + doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue());     System.out.println("車主地址:" + doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue());    } 
  }catch(Exception e){ 
   e.printStackTrace(); }

2)SAX

SAX處理的優(yōu)點(diǎn)非常類似于流媒體的優(yōu)點(diǎn)。分析能夠立即開始,而不是等待所有的數(shù)據(jù)被處理。而且,由于應(yīng)用程序只是在讀取數(shù)據(jù)時(shí)檢查數(shù)據(jù),因此不需要將數(shù)據(jù)存儲(chǔ)在內(nèi)存中。這對(duì)于大型文檔來說是個(gè)巨大的優(yōu)點(diǎn)。事實(shí)上,應(yīng)用程序甚至不必解析整個(gè)文檔;它可以在某個(gè)條件得到滿足時(shí)停止解析。一般來說,SAX還比它的替代者DOM快許多。

選擇DOM還是選擇SAX? 對(duì)于需要自己編寫代碼來處理XML文檔的開發(fā)人員來說, 選擇DOM還是SAX解析模型是一個(gè)非常重要的設(shè)計(jì)決策。 DOM采用建立樹形結(jié)構(gòu)的方式訪問XML文檔,而SAX采用的事件模型。

DOM解析器把XML文檔轉(zhuǎn)化為一個(gè)包含其內(nèi)容的樹,并可以對(duì)樹進(jìn)行遍歷。用DOM解析模型的優(yōu)點(diǎn)是編程容易,開發(fā)人員只需要調(diào)用建樹的指令,然后利用navigation APIs訪問所需的樹節(jié)點(diǎn)來完成任務(wù)。可以很容易的添加和修改樹中的元素。然而由于使用DOM解析器的時(shí)候需要處理整個(gè)XML文檔,所以對(duì)性能和內(nèi)存的要求比較高,尤其是遇到很大的XML文件的時(shí)候。由于它的遍歷能力,DOM解析器常用于XML文檔需要頻繁的改變的服務(wù)中。

SAX解析器采用了基于事件的模型,它在解析XML文檔的時(shí)候可以觸發(fā)一系列的事件,當(dāng)發(fā)現(xiàn)給定的tag的時(shí)候,它可以激活一個(gè)回調(diào)方法,告訴該方法制定的標(biāo)簽已經(jīng)找到。SAX對(duì)內(nèi)存的要求通常會(huì)比較低,因?yàn)樗岄_發(fā)人員自己來決定所要處理的tag.特別是當(dāng)開發(fā)人員只需要處理文檔中所包含的部分?jǐn)?shù)據(jù)時(shí),SAX這種擴(kuò)展能力得到了更好的體現(xiàn)。但用SAX解析器的時(shí)候編碼工作會(huì)比較困難,而且很難同時(shí)訪問同一個(gè)文檔中的多處不同數(shù)據(jù)。
import org.xml.sax.*; 
import org.xml.sax.helpers.*; 
import javax.xml.parsers.*; 

public class MyXMLReader extends DefaultHandler {  java.util.Stack tags = new java.util.Stack(); 
 public MyXMLReader() { 
  super(); 
} 

 public static void main(String args[]) { 
  long lasting = System.currentTimeMillis(); 
  try { 
   SAXParserFactory sf = SAXParserFactory.newInstance(); 
   SAXParser sp = sf.newSAXParser(); 
   MyXMLReader reader = new MyXMLReader(); 
   sp.parse(new InputSource("data_10k.xml"), reader); 
  } catch (Exception e) { 
   e.printStackTrace(); 
  } 

  System.out.println("運(yùn)行時(shí)間:" + (System.currentTimeMillis() - lasting) + "毫秒");} 
  public void characters(char ch[], int start, int length) throws SAXException { 
  String tag = (String) tags.peek(); 
  if (tag.equals("NO")) { 
   System.out.print("車牌號(hào)碼:" + new String(ch, start, length)); 
} 
if (tag.equals("ADDR")) { 
  System.out.println("地址:" + new String(ch, start, length)); 
} 
} 

  public void startElement(String uri,String localName,String qName,Attributes attrs) { 
  tags.push(qName);} 
}

關(guān)于Apache Commons Configuration讀取xml配置的方法就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI