這篇文章將為大家詳細(xì)講解有關(guān)Apache Commons Configuration讀取xml配置的方法,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
10余年的永豐網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。全網(wǎng)整合營(yíng)銷(xiāo)推廣的優(yōu)勢(shì)是能夠根據(jù)用戶(hù)設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整永豐建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)公司從事“永豐網(wǎng)站設(shè)計(jì)”,“永豐網(wǎng)站推廣”以來(lái),每個(gè)客戶(hù)項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
近期項(xiàng)目自己手寫(xiě)一個(gè)字符串連接池。因?yàn)榄h(huán)境不同有開(kāi)發(fā)版本、測(cè)試版本、上線版本、每一個(gè)版本用到的數(shù)據(jù)庫(kù)也是不一樣的。所以需要能靈活的切換數(shù)據(jù)庫(kù)連接。當(dāng)然這個(gè)用maven就解決了。Apache Commons Configuration 框架用的主要是解析數(shù)據(jù)庫(kù)連接字符串。
下面介紹Apache Commons Configuration 框架的常用部分。
**
下載jar包http://www.php.cn/或者h(yuǎn)ttp://www.php.cn/ maven中搜索下載
研究api的使用。
·當(dāng)xml結(jié)構(gòu)大變化的時(shí)候不用過(guò)多的修改解析xml的代碼
用戶(hù)只需要修改自己的解析語(yǔ)法樹(shù)即可。
客戶(hù)只需要修改語(yǔ)法樹(shù)框架去解析,思考的起點(diǎn)是不是跟設(shè)計(jì)模式中的解釋器模式類(lèi)似。構(gòu)建抽象語(yǔ)法樹(shù)并解釋執(zhí)行。
用戶(hù)只需要關(guān)心和修改自己的解析語(yǔ)法樹(shù)即可。
用戶(hù)不用關(guān)系如何解析只需要配置對(duì)應(yīng)的解析語(yǔ)法規(guī)則即可。
簡(jiǎn)化程序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"));
}輸出如下:說(shuō)明已經(jīng)成功解析xml了。
127.0.0.1
3306
admin
獲取的方法有很多種更詳細(xì)的獲取方法可以從AbstractConfiguration方法中對(duì)應(yīng)找到。
上面配置的是一個(gè)數(shù)據(jù)庫(kù)的連接信息,如果配置很多數(shù)據(jù)庫(kù)的連接信息,怎么解析連接信息切換呢。修改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ù)庫(kù)連接信息,程序如下:
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開(kāi)始的。
點(diǎn)的訪問(wèn)方式上面的那種方式是沒(méi)問(wèn)題,對(duì)于一些復(fù)雜的配置來(lái)講,我們可能需要使用XPath表達(dá)式語(yǔ)言。這里的主要優(yōu)點(diǎn)是,使用了XML的高級(jí)查詢(xún),程序看起來(lái)仍然比較簡(jiǎn)潔易懂。可理解性高。
還是解析上面的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
測(cè)試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ù)庫(kù)字符串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);
}
}測(cè)試ok沒(méi)問(wèn)題。
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ì)輪詢(xún)配置文件,當(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語(yǔ)言中xml解析有很多種方式,最流行的方式有sax和dom兩種。
1. dom是把所有的解析內(nèi)容一次性加入內(nèi)存所以xml內(nèi)容大的話性能不好。
2. sax是驅(qū)動(dòng)解析。所以?xún)?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> <ADDR>springok</ADDR> </VALUE> </RESULT>
DOM是用與平臺(tái)和語(yǔ)言無(wú)關(guān)的方式表示XML文檔的官方W3C標(biāo)準(zhǔn)。DOM是以層次結(jié)構(gòu)組織的節(jié)點(diǎn)或信息片斷的集合。這個(gè)層次結(jié)構(gòu)允許開(kāi)發(fā)人員在樹(shù)中尋找特定信息。分析該結(jié)構(gòu)通常需要加載整個(gè)文檔和構(gòu)造層次結(jié)構(gòu),然后才能做任何工作。由于它是基于信息層次的,因而DOM被認(rèn)為是基于樹(shù)或基于對(duì)象的。DOM以及廣義的基于樹(shù)的處理具有幾個(gè)優(yōu)點(diǎn)。首先,由于樹(shù)在內(nèi)存中是持久的,因此可以修改它以便應(yīng)用程序能對(duì)數(shù)據(jù)和結(jié)構(gòu)作出更改。它還可以在任何時(shí)候在樹(shù)中上下導(dǎo)航,而不是像SAX那樣是一次性的處理。DOM使用起來(lái)也要簡(jiǎn)單得多。
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("車(chē)牌號(hào)碼:" + doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue()); System.out.println("車(chē)主地址:" + doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue()); }
}catch(Exception e){
e.printStackTrace(); }SAX處理的優(yōu)點(diǎn)非常類(lèi)似于流媒體的優(yōu)點(diǎn)。分析能夠立即開(kāi)始,而不是等待所有的數(shù)據(jù)被處理。而且,由于應(yīng)用程序只是在讀取數(shù)據(jù)時(shí)檢查數(shù)據(jù),因此不需要將數(shù)據(jù)存儲(chǔ)在內(nèi)存中。這對(duì)于大型文檔來(lái)說(shuō)是個(gè)巨大的優(yōu)點(diǎn)。事實(shí)上,應(yīng)用程序甚至不必解析整個(gè)文檔;它可以在某個(gè)條件得到滿足時(shí)停止解析。一般來(lái)說(shuō),SAX還比它的替代者DOM快許多。 選擇DOM還是選擇SAX? 對(duì)于需要自己編寫(xiě)代碼來(lái)處理XML文檔的開(kāi)發(fā)人員來(lái)說(shuō), 選擇DOM還是SAX解析模型是一個(gè)非常重要的設(shè)計(jì)決策。 DOM采用建立樹(shù)形結(jié)構(gòu)的方式訪問(wèn)XML文檔,而SAX采用的事件模型。 DOM解析器把XML文檔轉(zhuǎn)化為一個(gè)包含其內(nèi)容的樹(shù),并可以對(duì)樹(shù)進(jìn)行遍歷。用DOM解析模型的優(yōu)點(diǎn)是編程容易,開(kāi)發(fā)人員只需要調(diào)用建樹(shù)的指令,然后利用navigation APIs訪問(wèn)所需的樹(shù)節(jié)點(diǎn)來(lái)完成任務(wù)。可以很容易的添加和修改樹(shù)中的元素。然而由于使用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)樗岄_(kāi)發(fā)人員自己來(lái)決定所要處理的tag.特別是當(dāng)開(kāi)發(fā)人員只需要處理文檔中所包含的部分?jǐn)?shù)據(jù)時(shí),SAX這種擴(kuò)展能力得到了更好的體現(xiàn)。但用SAX解析器的時(shí)候編碼工作會(huì)比較困難,而且很難同時(shí)訪問(wèn)同一個(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("車(chē)牌號(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)目自己手寫(xiě)一個(gè)字符串連接池。因?yàn)榄h(huán)境不同有開(kāi)發(fā)版本、測(cè)試版本、上線版本、每一個(gè)版本用到的數(shù)據(jù)庫(kù)也是不一樣的。所以需要能靈活的切換數(shù)據(jù)庫(kù)連接。當(dāng)然這個(gè)用maven就解決了。Apache Commons Configuration 框架用的主要是解析數(shù)據(jù)庫(kù)連接字符串。
下面介紹Apache Commons Configuration 框架的常用部分。
**
下載jar包http://www.php.cn/或者h(yuǎn)ttp://www.php.cn/ maven中搜索下載
研究api的使用。
·當(dāng)xml結(jié)構(gòu)大變化的時(shí)候不用過(guò)多的修改解析xml的代碼
用戶(hù)只需要修改自己的解析語(yǔ)法樹(shù)即可。
客戶(hù)只需要修改語(yǔ)法樹(shù)框架去解析,思考的起點(diǎn)是不是跟設(shè)計(jì)模式中的解釋器模式類(lèi)似。構(gòu)建抽象語(yǔ)法樹(shù)并解釋執(zhí)行。
用戶(hù)只需要關(guān)心和修改自己的解析語(yǔ)法樹(shù)即可。
用戶(hù)不用關(guān)系如何解析只需要配置對(duì)應(yīng)的解析語(yǔ)法規(guī)則即可。
簡(jiǎn)化程序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"));
}輸出如下:說(shuō)明已經(jīng)成功解析xml了。
127.0.0.1
3306
admin
獲取的方法有很多種更詳細(xì)的獲取方法可以從AbstractConfiguration方法中對(duì)應(yīng)找到。
上面配置的是一個(gè)數(shù)據(jù)庫(kù)的連接信息,如果配置很多數(shù)據(jù)庫(kù)的連接信息,怎么解析連接信息切換呢。修改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ù)庫(kù)連接信息,程序如下:
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開(kāi)始的。
點(diǎn)的訪問(wèn)方式上面的那種方式是沒(méi)問(wèn)題,對(duì)于一些復(fù)雜的配置來(lái)講,我們可能需要使用XPath表達(dá)式語(yǔ)言。這里的主要優(yōu)點(diǎn)是,使用了XML的高級(jí)查詢(xún),程序看起來(lái)仍然比較簡(jiǎn)潔易懂。可理解性高。
還是解析上面的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
測(cè)試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ù)庫(kù)字符串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);
}
}測(cè)試ok沒(méi)問(wèn)題。
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ì)輪詢(xún)配置文件,當(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語(yǔ)言中xml解析有很多種方式,最流行的方式有sax和dom兩種。
1. dom是把所有的解析內(nèi)容一次性加入內(nèi)存所以xml內(nèi)容大的話性能不好。
2. sax是驅(qū)動(dòng)解析。所以?xún)?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> <ADDR>springok</ADDR> </VALUE> </RESULT>
DOM是用與平臺(tái)和語(yǔ)言無(wú)關(guān)的方式表示XML文檔的官方W3C標(biāo)準(zhǔn)。DOM是以層次結(jié)構(gòu)組織的節(jié)點(diǎn)或信息片斷的集合。這個(gè)層次結(jié)構(gòu)允許開(kāi)發(fā)人員在樹(shù)中尋找特定信息。分析該結(jié)構(gòu)通常需要加載整個(gè)文檔和構(gòu)造層次結(jié)構(gòu),然后才能做任何工作。由于它是基于信息層次的,因而DOM被認(rèn)為是基于樹(shù)或基于對(duì)象的。DOM以及廣義的基于樹(shù)的處理具有幾個(gè)優(yōu)點(diǎn)。首先,由于樹(shù)在內(nèi)存中是持久的,因此可以修改它以便應(yīng)用程序能對(duì)數(shù)據(jù)和結(jié)構(gòu)作出更改。它還可以在任何時(shí)候在樹(shù)中上下導(dǎo)航,而不是像SAX那樣是一次性的處理。DOM使用起來(lái)也要簡(jiǎn)單得多。
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("車(chē)牌號(hào)碼:" + doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue()); System.out.println("車(chē)主地址:" + doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue()); }
}catch(Exception e){
e.printStackTrace(); }SAX處理的優(yōu)點(diǎn)非常類(lèi)似于流媒體的優(yōu)點(diǎn)。分析能夠立即開(kāi)始,而不是等待所有的數(shù)據(jù)被處理。而且,由于應(yīng)用程序只是在讀取數(shù)據(jù)時(shí)檢查數(shù)據(jù),因此不需要將數(shù)據(jù)存儲(chǔ)在內(nèi)存中。這對(duì)于大型文檔來(lái)說(shuō)是個(gè)巨大的優(yōu)點(diǎn)。事實(shí)上,應(yīng)用程序甚至不必解析整個(gè)文檔;它可以在某個(gè)條件得到滿足時(shí)停止解析。一般來(lái)說(shuō),SAX還比它的替代者DOM快許多。 選擇DOM還是選擇SAX? 對(duì)于需要自己編寫(xiě)代碼來(lái)處理XML文檔的開(kāi)發(fā)人員來(lái)說(shuō), 選擇DOM還是SAX解析模型是一個(gè)非常重要的設(shè)計(jì)決策。 DOM采用建立樹(shù)形結(jié)構(gòu)的方式訪問(wèn)XML文檔,而SAX采用的事件模型。 DOM解析器把XML文檔轉(zhuǎn)化為一個(gè)包含其內(nèi)容的樹(shù),并可以對(duì)樹(shù)進(jìn)行遍歷。用DOM解析模型的優(yōu)點(diǎn)是編程容易,開(kāi)發(fā)人員只需要調(diào)用建樹(shù)的指令,然后利用navigation APIs訪問(wèn)所需的樹(shù)節(jié)點(diǎn)來(lái)完成任務(wù)。可以很容易的添加和修改樹(shù)中的元素。然而由于使用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)樗岄_(kāi)發(fā)人員自己來(lái)決定所要處理的tag.特別是當(dāng)開(kāi)發(fā)人員只需要處理文檔中所包含的部分?jǐn)?shù)據(jù)時(shí),SAX這種擴(kuò)展能力得到了更好的體現(xiàn)。但用SAX解析器的時(shí)候編碼工作會(huì)比較困難,而且很難同時(shí)訪問(wèn)同一個(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("車(chē)牌號(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í)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
當(dāng)前文章:ApacheCommonsConfiguration讀取xml配置的方法
轉(zhuǎn)載注明:http://chinadenli.net/article4/gsgcoe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、靜態(tài)網(wǎng)站、自適應(yīng)網(wǎng)站、用戶(hù)體驗(yàn)、品牌網(wǎng)站建設(shè)、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)