dom4j從jar包中讀取xml文件的辦法。本站提示廣大學習愛好者:(dom4j從jar包中讀取xml文件的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是dom4j從jar包中讀取xml文件的辦法正文
停止封裝的時刻,我們經常須要用xml來界說一些標准,在零丁運轉讀取的時刻固然不會有成績,但這些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包內的目次為
com/jianxin/xml
user.xml
而這裡辦法內照樣去src下去找user.xml,就算把src/從途徑中去失落,依然沒法定位到jar中的user.xml上。
這重要是由於jar包是一個零丁的文件而非文件夾,相對不克不及經由過程"file:/d:.../user.xml"這類情勢來對文件定位,所以即便是絕對途徑,也沒法定位到jar文件內的文件。
那末把xml打入jar包,不管user.xml在哪一個目次下,jar包中的類都可以找到,這會是理想嗎?
固然不是,我們可以用類裝載器(ClassLoader)來做到:
1)ClassLoader是類加載器的籠統類。它可以運轉時靜態的獲得加載類的運轉信息。可以如許說,當我們挪用xml.jar中的ReadXML類時,JVM加載進ReadXML類,並記載下ReadXML運轉時信息(包含地點jar包的根途徑信息)。而ClassLoader類中的辦法 可以贊助我們靜態獲得這些信息:
a.public URL getResource(String),查找且有給命名稱的資本。
b.public InputStream getResourceAsStream(String name),前往指定資本輸出流
2)ClassLoader是abstract的,弗成能實例化。我們真正寫代碼的時刻,是經由過程Class類中的getResource和getResourceAsStream辦法 ,這兩個辦法會拜托ClassLoader中的getResource和getResourceAsStream辦法。如今對下面辦法停止重寫:
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();
}
}
如許,打包之前運轉是沒有成績的,打成包後,仍然是可以運轉找到數據的~。
在這裡我感到最主要的就是獲得Class同時會獲得jar根目次信息,同時ClassLoader也會有所轉變,這點須要留意一下,至於究竟是甚麼轉變,今朝我也說不下去,只是碰著了如許的成績。所以籌劃看一本Java比擬底層的書,以讓本身在為他人封裝器械的時刻加倍得心就手,一向逗留在運用條理的我們,也是時刻深刻懂得一下JVM了。
比來年夜部門時光都是在開辟,說好的jira能夠會更晚些,做的進程中,做是用了一下dwr,下篇對其停止描寫~~~