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,下篇对其进行描述~~~

(0)

相关推荐

  • java使用dom4j操作xml示例代码

    dom4j是一个非常优秀的Java XML API,具有性能优异.功能强大和极端易用使用的特点,同时它也是一个开放源工具.可以在这个地址http://dom4j.sourceforge.net进行下载.这里我们使用到的dom4j是dom4j-1.6.1这个版本,我们只需要使用到如下两个jar包: 复制代码 代码如下: dom4j-1.6.1.jarcommons-io-2.4.jar 1.dom4j读取xml字符串 复制代码 代码如下: import org.dom4j.Document;imp

  • java dom4j解析xml用到的几个方法

    1. 读取并解析XML文档: 复制代码 代码如下: SAXReader reader = new SAXReader(); Document document = reader.read(new File(fileName)); reader的read方法是重载的,可以从InputStream, File, Url等多种不同的源来读取.得到的Document对象就带表了整个XML. 读取的字符编码是按照XML文件头定义的编码来转换.如果遇到乱码问题,注意要把各处的编码名称保持一致即可. 2. 取

  • java基于dom4j包实现对XML解析的方法

    本文实例讲述了java基于dom4j包实现对XML解析的方法.分享给大家供大家参考,具体如下: 本例中的xml文件内容如下: <?xml version = "1.0" encoding="UTF-8"?> <!-- Copyright 难免有错 这是注释--> <自定义的> <!-- iloveyou --> <你喜欢的名字就好> <who a = "i"></who

  • java中利用Dom4j解析和生成XML文档

    一.前言 dom4j是一套非常优秀的Java开源api,主要用于读写xml文档,具有性能优异.功能强大.和非常方便使用的特点.   另外xml经常用于数据交换的载体,像调用webservice传递的参数,以及数据做同步操作等等,   所以使用dom4j解析xml是非常有必要的. 二.准备条件 dom4j.jar 下载地址:http://sourceforge.net/projects/dom4j/ 三.使用Dom4j实战 1.解析xml文档 实现思路: <1>根据读取的xml路径,传递给SAX

  • java dom4j解析xml文件代码实例分享

    解析xml文件有两种方式,一种是利用Dom去解析,这种方式写起代码比较麻烦,对于刚入手的程序员来说比较容易出问题:第二种就是使用Dom4j包去解析在要使用Dom4j包的时候,肯定要先引入包 复制代码 代码如下: import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.io.Writer;import java.util.Iterator; import org.dom4j.Docum

  • 通过dom4j解析xml字符串(示例代码)

    复制代码 代码如下: import java.util.Iterator;import java.util.List;import org.dom4j.Attribute;import org.dom4j.Document;import org.dom4j.DocumentHelper;import org.dom4j.Element;public class Test { @SuppressWarnings("unchecked") public static void main(S

  • java DOM4J 读取XML实例代码

    下面展示一篇我自己写的一个XML读取测试 复制代码 代码如下: import java.util.Iterator;import java.io.BufferedReader;import java.io.File;import java.io.IOException;import java.io.InputStreamReader;import java.net.MalformedURLException;import org.dom4j.*;import org.dom4j.io.SAXRe

  • java使用xpath和dom4j解析xml

    1 XML文件解析的4种方法 通常解析XML文件有四种经典的方法.基本的解析方式有两种,一种叫SAX,另一种叫DOM.SAX是基于事件流的解析,DOM是基于XML文档树结构的解析.在此基础上,为了减少DOM.SAX的编码量,出现了JDOM,其优点是,20-80原则(帕累托法则),极大减少了代码量.通常情况下JDOM使用时满足要实现的功能简单,如解析.创建等要求.但在底层,JDOM还是使用SAX(最常用).DOM.Xanan文档.另外一种是DOM4J,是一个非常非常优秀的Java XML API,

  • java解析xml之dom4j解析xml示例分享

    复制代码 代码如下: package com.test; import java.io.File;import java.util.ArrayList;import java.util.Iterator;import java.util.List; import org.dom4j.Document;import org.dom4j.Element;import org.dom4j.io.SAXReader; public class Dom4jXML { public static void

  • dom4j操作xml的demo(分享)

    废话不多说,直接上代码 package com.cn.shop.util; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStreamWriter; import java.util.Iterator; import java.util.List; import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.D

  • 在java中使用dom4j解析xml(示例代码)

    虽然Java中已经有了Dom和Sax这两种标准解析方式 但其操作起来并不轻松,对于我这么一个初学者来说,其中部分代码是活生生的恶心 为此,伟大的第三方开发组开发出了Jdom和Dom4j等工具 鉴于目前的趋势,我们这里来讲讲Dom4j的基本用法,不涉及递归等复杂操作 Dom4j的用法很多,官网上的示例有那么点儿晦涩,这里就不写了 首先我们需要出创建一个xml文档,然后才能对其解析 xml文档: 复制代码 代码如下: <?xml version="1.0" encoding=&quo

随机推荐