dom4j從jar包中讀取xml文件的方法
進(jìn)行封裝的時(shí)候,我們常常需要用xml來(lái)定義一些規(guī)范,在單獨(dú)運(yùn)行讀取的時(shí)候當(dāng)然不會(huì)有問(wèn)題,但這些xml是往往是放在jar包里的,這樣一來(lái),這些東西就找不出來(lái)了。文中用到的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>
下面來(lái)看代碼:
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下,很顯然運(yùn)行以上代碼是可以出來(lái)結(jié)果的,但如果把以上代碼打包,這個(gè)jar包內(nèi)的目錄為
com/jianxin/xml
user.xml
而這里方法內(nèi)還是去src下去找user.xml,就算把src/從路徑中去掉,仍然無(wú)法定位到j(luò)ar中的user.xml上。
這主要是因?yàn)閖ar包是一個(gè)單獨(dú)的文件而非文件夾,絕對(duì)不能通過(guò)"file:/d:.../user.xml"這種形式來(lái)對(duì)文件定位,所以即使是相對(duì)路徑,也無(wú)法定位到j(luò)ar文件內(nèi)的文件。
那么把xml打入jar包,無(wú)論user.xml在哪個(gè)目錄下,jar包中的類都可以找到,這會(huì)是幻想嗎?
當(dāng)然不是,我們可以用類裝載器(ClassLoader)來(lái)做到:
1)ClassLoader是類加載器的抽象類。它可以運(yùn)行時(shí)動(dòng)態(tài)的獲取加載類的運(yùn)行信息。可以這樣說(shuō),當(dāng)我們調(diào)用xml.jar中的ReadXML類時(shí),JVM加載進(jìn)ReadXML類,并記錄下ReadXML運(yùn)行時(shí)信息(包括所在jar包的根路徑信息)。而ClassLoader類中的方法 可以幫助我們動(dòng)態(tài)獲取這些信息:
a.public URL getResource(String),查找且有給定名稱的資源。
b.public InputStream getResourceAsStream(String name),返回指定資源輸入流
2)ClassLoader是abstract的,不可能實(shí)例化。我們真正寫代碼的時(shí)候,是通過(guò)Class類中的getResource和getResourceAsStream方法 ,這兩個(gè)方法會(huì)委托ClassLoader中的getResource和getResourceAsStream方法?,F(xiàn)在對(duì)上面方法進(jì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();
}
}
這樣,打包之前運(yùn)行是沒(méi)有問(wèn)題的,打成包后,依然是可以運(yùn)行找到數(shù)據(jù)的~。
在這里我感覺(jué)最重要的就是獲取Class同時(shí)會(huì)獲取jar根目錄信息,同時(shí)ClassLoader也會(huì)有所改變,這點(diǎn)需要注意一下,至于到底是什么改變,目前我也說(shuō)不上來(lái),只是碰到了這樣的問(wèn)題。所以計(jì)劃看一本Java比較底層的書,以讓自己在為別人封裝東西的時(shí)候更加得心就手,一直停留在應(yīng)用層次的我們,也是時(shí)候深入了解一下JVM了。
最近大部分時(shí)間都是在開發(fā),說(shuō)好的jira可能會(huì)更晚些,做的過(guò)程中,做是用了一下dwr,下篇對(duì)其進(jìn)行描述~~~
相關(guān)文章
SpringMvc使用GoogleKaptcha生成驗(yàn)證碼
這篇文章主要為大家詳細(xì)介紹了SpringMvc項(xiàng)目中使用GoogleKaptcha 生成驗(yàn)證碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09Java開發(fā)環(huán)境配置教程(win7 64bit)
這篇文章主要為大家詳細(xì)介紹了win7 64bit下Java開發(fā)環(huán)境的配置教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08淺談Servlet 實(shí)現(xiàn)網(wǎng)頁(yè)重定向的方法
本篇文章主要介紹了Servlet 實(shí)現(xiàn)重定向幾種方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08基于Java實(shí)現(xiàn)Json文件轉(zhuǎn)換為Excel文件
這篇文章主要為大家詳細(xì)介紹了如何利用Java實(shí)現(xiàn)Json文件轉(zhuǎn)換為Excel文件,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下2022-12-12Netty開發(fā)及粘包實(shí)戰(zhàn)解決分析
這篇文章主要為大家介紹了Netty開發(fā)及粘包實(shí)戰(zhàn)解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-02-02java?SpringBoot注解@Async不生效的解決方法
大家好,本篇文章主要講的是java?SpringBoot注解@Async不生效的解決方法,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01