dom4j从jar包中读取xml文件的方法_Java教程-查字典教程网
dom4j从jar包中读取xml文件的方法
dom4j从jar包中读取xml文件的方法
发布时间:2016-12-28 来源:查字典编辑
摘要:进行封装的时候,我们常常需要用xml来定义一些规范,在单独运行读取的时候当然不会有问题,但这些xml是往往是放在jar包里的,这样一来,这些...

进行封装的时候,我们常常需要用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,下篇对其进行描述~~~

相关阅读
推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
  • 大家都在看
  • 小编推荐
  • 猜你喜欢
  • 最新Java学习
    热门Java学习
    编程开发子分类