一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - dom4j從jar包中讀取xml文件的方法

dom4j從jar包中讀取xml文件的方法

2019-11-05 11:35java技術網 JAVA教程

這篇文章主要介紹了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,下篇對其進行描述~~~

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲精品91香蕉综合区 | 人人人人看人人人做人人 | 香蕉久草在线 | a级毛片毛片免费很很综合 a级黄色视屏 | 国产一级片免费观看 | fuqer日本 | 99精品国产成人一区二区在线 | 日韩精品成人 | 东北恋哥在线播放免费播放 | 亚洲欧美乱 | 精品国产区一区二区三区在线观看 | 亚洲女人国产香蕉久久精品 | 深夜成人 | 欧美va在线播放免费观看 | 97se亚洲国产综合自在线观看 | 2012在线观看免费视频大全 | 动漫美女胸被狂揉扒开吃奶动态图 | 国产一二在线观看视频网站 | 91视频www | 10个免费货源网站 | 午夜精品久久久久久久99蜜桃i | 青青视频国产依人在线 | 嗯啊视频在线观看 | 精品一成人岛国片在线观看 | 国产私拍精品88福利视频 | 日本热妇| sao虎在线精品永久在线 | 国产午夜成人无码免费看 | 久久这里都是精品 | 国产成人性毛片aaww | 色老板免费在线观看 | 五月九九 | 古代双性美人被老糟蹋 | 欧美日韩精品亚洲精品v18 | 精品国产欧美一区二区五十路 | 成人在线观看网站 | 欧美日韩不卡视频 | 99精品免费视频 | 欧美日韩免费一区二区在线观看 | 青青网在线视频 | 亚洲精品tv久久久久久久久久 |