dom4j從jar包中讀取xml文件的方法
進行封裝的時候,我們常常需要用xml來定義一些規(guī)范,在單獨運行讀取的時候當然不會有問題,但這些xml是往往是放在jar包里的,這樣一來,這些東西就找不出來了。文中用到的xml定義如下:
<?xml version="1.0" encoding="utf-8"?>
<ACCESOS>
<item>
<SOCIO name="adsf">
<NUMERO>00045050</NUMERO>
<REPOSICION>0</REPOSICION>
<NOMBRE>MOISES MORENO</NOMBRE>
<TURNOS>
<LU>T1</LU>
<MA>T2</MA>
<MI>T3</MI>
<JU>T4</JU>
<VI>T5</VI>
<SA>T6</SA>
<DO>T7</DO>
</TURNOS>
</SOCIO>
</item>
<item>
<SOCIO name="adsfa">
<NUMERO>00045051</NUMERO>
<REPOSICION>0</REPOSICION>
<NOMBRE>RUTH PENA</NOMBRE>
<TURNOS>
<LU>S1</LU>
<MA>S2</MA>
<MI>S3</MI>
<JU>S4</JU>
<VI>S5</VI>
<SA>S6</SA>
<DO>S7</DO>
</TURNOS>
</SOCIO>
</item>
</ACCESOS>
下面來看代碼:
public void read(){
try {
Document doc = new SAXReader().read(new File("src/user.xml"));
List<Element> itemList = doc.selectNodes("/ACCESOS/item/SOCIO");
for (Iterator<Element> iter = itemList.iterator(); iter.hasNext();){
Element element = iter.next();
System.out.println("NUMERO =" + element.elementText("NUMERO"));
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
這段代碼 寫在Java Project中,其中user.xml放在src根目錄下,類在src/com/jianxin/xml下,很顯然運行以上代碼是可以出來結果的,但如果把以上代碼打包,這個jar包內(nèi)的目錄為
com/jianxin/xml
user.xml
而這里方法內(nèi)還是去src下去找user.xml,就算把src/從路徑中去掉,仍然無法定位到jar中的user.xml上。
這主要是因為jar包是一個單獨的文件而非文件夾,絕對不能通過"file:/d:.../user.xml"這種形式來對文件定位,所以即使是相對路徑,也無法定位到jar文件內(nèi)的文件。
那么把xml打入jar包,無論user.xml在哪個目錄下,jar包中的類都可以找到,這會是幻想嗎?
當然不是,我們可以用類裝載器(ClassLoader)來做到:
1)ClassLoader是類加載器的抽象類。它可以運行時動態(tài)的獲取加載類的運行信息??梢赃@樣說,當我們調(diào)用xml.jar中的ReadXML類時,JVM加載進ReadXML類,并記錄下ReadXML運行時信息(包括所在jar包的根路徑信息)。而ClassLoader類中的方法 可以幫助我們動態(tài)獲取這些信息:
a.public URL getResource(String),查找且有給定名稱的資源。
b.public InputStream getResourceAsStream(String name),返回指定資源輸入流
2)ClassLoader是abstract的,不可能實例化。我們真正寫代碼的時候,是通過Class類中的getResource和getResourceAsStream方法 ,這兩個方法會委托ClassLoader中的getResource和getResourceAsStream方法?,F(xiàn)在對上面方法進行重寫:
public void read(){
try {
InputStream is=this.getClass().getResourceAsStream("/user.xml");
Document doc = new SAXReader().read(is);
List<Element> itemList = doc.selectNodes("/ACCESOS/item/SOCIO");
for (Iterator<Element> iter = itemList.iterator(); iter.hasNext();){
Element element = iter.next();
System.out.println("NUMERO =" + element.elementText("NUMERO"));
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
這樣,打包之前運行是沒有問題的,打成包后,依然是可以運行找到數(shù)據(jù)的~。
在這里我感覺最重要的就是獲取Class同時會獲取jar根目錄信息,同時ClassLoader也會有所改變,這點需要注意一下,至于到底是什么改變,目前我也說不上來,只是碰到了這樣的問題。所以計劃看一本Java比較底層的書,以讓自己在為別人封裝東西的時候更加得心就手,一直停留在應用層次的我們,也是時候深入了解一下JVM了。
最近大部分時間都是在開發(fā),說好的jira可能會更晚些,做的過程中,做是用了一下dwr,下篇對其進行描述~~~
相關文章
mybatis(mybatis-plus)映射文件(XML文件)中特殊字符轉(zhuǎn)義的實現(xiàn)
XML 文件在解析時會將五種特殊字符進行轉(zhuǎn)義,本文主要介紹了mybatis(mybatis-plus)映射文件(XML文件)中特殊字符轉(zhuǎn)義的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下2023-12-12
設計模式系列之組合模式及其在JDK和MyBatis源碼中的運用詳解
這篇文章主要介紹了組合模式及其在JDK和MyBatis源碼中的運用,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09
Spring如何集成ibatis項目并實現(xiàn)dao層基類封裝
這篇文章主要介紹了Spring如何集成ibatis項目并實現(xiàn)dao層基類封裝,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-09-09
JAVA String轉(zhuǎn)化成java.sql.date和java.sql.time方法示例
這篇文章主要給大家分享了關于JAVA String轉(zhuǎn)化成java.sql.date和java.sql.time的方法,文中給出了詳細的示例代碼,相信對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。2017-03-03
SpringBoot整合RestTemplate用法的實現(xiàn)
本篇主要介紹了RestTemplate中的GET,POST,PUT,DELETE、文件上傳和文件下載6大常用的功能,具有一定的參考價值,感興趣的可以了解一下2023-08-08

