氧氣中毒 - J2EE

          爪吐奕奕征途
          posts - 24, comments - 10, trackbacks - 0, articles - 0
             :: 首頁 :: 新隨筆 ::  ::  :: 管理

          XML配置文件的讀取處理

          Posted on 2006-06-14 15:17 氧氣中毒 閱讀(347) 評論(0)  編輯  收藏 所屬分類: 數據處理
          Java和XML是黃金組合,網上已經有很多文章介紹,XML作為電子商務中數據交換,已經有其不可替代的作用,但是在平時系統開發中,我們不一定都用到數據交換,是不是無法使用XML了?


          當然不是,現在已經有一個新趨勢,java程序的配置文件都開始使用XML格式,以前是使用類似windows的INI格式.(Java中也有Propertiesy這樣的類專門處理這樣的屬性配置文件).使用XML作為Java的配置文件有很多好處,從Tomcat的安裝配置文件和J2ee的配置文件中,我們已經看到XML的普遍應用,讓我們也跟隨流行趨勢用XML武裝起來.


          現在關鍵是如何讀取XML配置文件?有好幾種XML解析器:主要有DOM和SAX ,這些區別網上文章介紹很多.


          在apache的XML項目組中,目前有Xerces Xalan Cocoon幾個開發XML相關技術的project.Tomcat本身使用的是 Sun 的 JAXP,而其XSL Taglib project中使用Xerces解析器.


          好了,上面都是比較煩人的理論問題,還是趕快切入XML的配置文件的讀取吧.


          在我們的程序中,通常要有一些根據主機環境確定的變量.比如數據庫訪問用戶名和密碼,不同的主機可能設置不一樣.只要更改XML配置文件,就可以正常運行.





          localhost

          sqlname

          username

          password










          上面這個myenv.xml配置文件一般是放在tomcat的WEB-INF/classes目錄下.


          我們編制一個Java程序直接讀取,將dbhost dbuser dbpassword提取出來供其他程序訪問數據庫用.

          目前使用SAX比較的多,與DOM主要區別是 SAX是一行一行讀取XML文件進行分析,適合比較大文件,DOM是一次性讀入內存,顯然不能對付大文件.這里我們使用SAX解析,由于SAX解析器不斷在發展,網上有不少文章是針對老版本的.如果你使用JDK1.4 ,可以參考 使用SAX處理XML文檔 一文.這里的程序是根據其改進并且經過實踐調試得來的.

          對上面myenv.xml讀取的Java程序:

          ?1import?org.xml.sax.Attributes;?
          ?2
          ?3import?org.xml.sax.helpers.DefaultHandler;?
          ?4
          ?5import?org.xml.sax.SAXException;?
          ?6
          ?7import?java.util.Properties;?
          ?8
          ?9
          10//使用DefaultHandler的好處?是?不必陳列出所有方法,?
          11
          12public?class?ConfigParser?extends?DefaultHandler?{?
          13
          14
          15////定義一個Properties?用來存放?dbhost?dbuser?dbpassword的值?
          16
          17private?Properties?props;?
          18
          19
          20private?String?currentSet;?
          21
          22private?String?currentName;?
          23
          24private?StringBuffer?currentValue?=?new?StringBuffer();?
          25
          26
          27//構建器初始化props?
          28
          29public?ConfigParser()?{?
          30
          31
          32this.props?=?new?Properties();?
          33
          34}
          ?
          35
          36
          37public?Properties?getProps()?{?
          38
          39return?this.props;?
          40
          41}
          ?
          42
          43
          44
          45
          46//定義開始解析元素的方法.?這里是將中的名稱xxx提取出來.?
          47
          48public?void?startElement(String?uri,?String?localName,?String?qName,?Attributes?attributes)?
          49
          50throws?SAXException?{?
          51
          52currentValue.delete(0,?currentValue.length());?
          53
          54this.currentName?=qName;?
          55
          56
          57
          58
          59
          60}
          ?
          61
          62
          63//這里是將之間的值加入到currentValue?
          64
          65
          66public?void?characters(char[]?ch,?int?start,?int?length)?throws?SAXException?{?
          67
          68
          69currentValue.append(ch,?start,?length);?
          70
          71
          72}
          ?
          73
          74
          75//在遇到結束后,將之前的名稱和值一一對應保存在props中?
          76
          77
          78public?void?endElement(String?uri,?String?localName,?String?qName)?throws?SAXException?{?
          79
          80
          81props.put(qName.toLowerCase(),?currentValue.toString().trim());?
          82
          83}
          ?
          84
          85
          86}
          ?
          87

          上面的這個解析程序比較簡單吧? 其實解析XML就是這么簡單.

          現在我們已經將dbhost dbuser dbpassword的值localhost sqlname username password提取了出來.但是這只是在在解析器內部,我們的程序還不能訪問.需要再編制一個程序.

          ?1
          ?2import?java.util.Properties;?
          ?3
          ?4import?javax.xml.parsers.SAXParser;?
          ?5
          ?6import?javax.xml.parsers.SAXParserFactory;?
          ?7
          ?8import?java.net.URL;?
          ?9
          10
          11public?class?ParseXML{?
          12
          13
          14//定義一個Properties?用來存放?dbhost?dbuser?dbpassword的值?
          15
          16private?Properties?props;?
          17
          18
          19
          20//這里的props?
          21
          22public?Properties?getProps()?{?
          23
          24return?this.props;?
          25
          26}
          ?
          27
          28
          29
          30
          31public?void?parse(String?filename)?throws?Exception?{?
          32
          33
          34//將我們的解析器對象化?
          35
          36ConfigParser?handler?=?new?ConfigParser();?
          37
          38
          39//獲取SAX工廠對象?
          40
          41SAXParserFactory?factory?=?SAXParserFactory.newInstance();?
          42
          43factory.setNamespaceAware(false);?
          44
          45factory.setValidating(false);?
          46
          47
          48//獲取SAX解析?
          49
          50SAXParser?parser?=?factory.newSAXParser();?
          51
          52
          53//得到配置文件myenv.xml所在目錄.?tomcat中是在WEB-INF/classes?
          54
          55//下例中BeansConstants是用來存放xml文件中配置信息的類,可以自己代替或定義?
          56
          57URL?confURL?=?BeansConstants.class.getClassLoader().getResource(filename);?
          58
          59
          60try?
          61
          62{?
          63
          64//將解析器和解析對象myenv.xml聯系起來,開始解析?
          65
          66parser.parse(confURL.toString(),?handler);?
          67
          68//獲取解析成功后的屬性?以后?我們其他應用程序只要調用本程序的props就可以提取出屬性名稱和值了?
          69
          70props?=?handler.getProps();?
          71
          72}
          finally{?
          73
          74factory=null;?
          75
          76parser=null;?
          77
          78handler=null;?
          79
          80}
          ?
          81
          82
          83}
          ?
          84
          85
          86}
          ?
          87

          由于我們的XML文件是使用最簡單的形式 ,因此解析器相對簡單,但是這已經足夠對付我們的配置文件了.
          判斷一個程序系統的先進性,我們先看看他的配置文件,如果還在使用老套的xxx=123 這樣類似.ini的文件,
          我們也許會微微一笑,他又落伍了.....
          主站蜘蛛池模板: 綦江县| 板桥市| 江北区| 图木舒克市| 铁力市| 宜兰市| 景泰县| 西盟| 吉木萨尔县| 策勒县| 广元市| 绍兴市| 达拉特旗| 新巴尔虎左旗| 额尔古纳市| 高尔夫| 上栗县| 锡林郭勒盟| 克什克腾旗| 华坪县| 宁安市| 蕉岭县| 宁海县| 区。| 无锡市| 沐川县| 江达县| 长阳| 邳州市| 诸城市| 思茅市| 泾川县| 错那县| 洛隆县| 梅州市| 平乐县| 望城县| 定安县| 罗江县| 樟树市| 阿城市|