您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(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 框架的常用部分。
**
下載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)容如下
<?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開始的。
點(diǎn)的訪問方式上面的那種方式是沒問題,對(duì)于一些復(fù)雜的配置來講,我們可能需要使用XPath表達(dá)式語言。這里的主要優(yōu)點(diǎn)是,使用了XML的高級(jí)查詢,程序看起來仍然比較簡潔易懂??衫斫庑愿摺?
還是解析上面的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.
EnvironmentConfiguration conf=new EnvironmentConfiguration(); System.out.println(conf.getMap());
源碼分析如何實(shí)現(xiàn):
public EnvironmentConfiguration() { super(new HashMap<String, Object>(System.getenv())); }
聯(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沒問題。
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)基于文件的配置變化的時(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>
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(); }
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 框架的常用部分。
**
下載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)容如下
<?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開始的。
點(diǎn)的訪問方式上面的那種方式是沒問題,對(duì)于一些復(fù)雜的配置來講,我們可能需要使用XPath表達(dá)式語言。這里的主要優(yōu)點(diǎn)是,使用了XML的高級(jí)查詢,程序看起來仍然比較簡潔易懂??衫斫庑愿?。
還是解析上面的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.
EnvironmentConfiguration conf=new EnvironmentConfiguration(); System.out.println(conf.getMap());
源碼分析如何實(shí)現(xiàn):
public EnvironmentConfiguration() { super(new HashMap<String, Object>(System.getenv())); }
聯(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沒問題。
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)基于文件的配置變化的時(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>
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(); }
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ò),可以把它分享出去讓更多的人看到。
免責(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)容。