`
aladdin_leon
  • 浏览: 117272 次
  • 性别: Icon_minigender_1
  • 来自: 哈尔滨
社区版块
存档分类
最新评论

XML配置文件的读取处理

阅读更多

     让我们先来聊聊XML吧,最初对XML的认识是在2004年,那时看过一本讲怎么样利用XML作网页的书,并没有觉得有什么特别的,好像这个东东和HTML差不多。随后开始接触JAVA Web开发,发现好多的配置文件都是用XML写的,例如Tomcat的web.xml...当然了当时也并没有怎么深入研究,只是知道怎么配置就可以了。后来慢慢接触了框架,发现配置文件几乎没有不是基于XML的,从Structs到Spring,再到Hibernate...于是开始思考这是为什么呢?难道Properties就不能解决问题吗?还没有想明白的时候,又一揽子的关于XML的技术涌进我的视野,Web Service中的SOAP、WSDL,电子商务中的数据交换,XML数据绑定,最近还有号称第三代数据库的DB2 v9的对XML的直接存取和查询...看来XML并没有我想的那么简单当然也没有XML选修课上老师讲得那么乏味,XML今天的在业界的流行就好像英语在世界的流行,但是流行一定是有原因的,就像JAVA的跨平台的大魔咒一样,XML也是平台无关的,无论JAVA还是.NET,或是其他某个还算有名气的平台,都提供了处理XML的API,所以就不会出现.ini和Properties各为其主的情形了。而且XML的格式是用户自由定义的,这样它的表达能力就很强大了,同时也就更加灵活了,能够满足不同的需求,所以这也可能是为什么配置文件大都是XML的原因吧。XML的好处还有很多,不过就需要我们慢慢体会和思考了...
     不过说句实话,我和XML的接触大多数是配置文件,有框架的配置文件,有数据库连接的配置文件...那现在就以数据库连接的配置文件为例讨论一下吧。以前习惯将DB连接信息直接写在代码里面,后来项目大了,需要改变了,问题呢,也就来了!如果需要修改DB连接信息,那我就要找到所有的含有DB连接信息的代码进行修改,然后还需要重新编译代码,好麻烦!有没有什么好的解决办法呢?后来慢慢学会把容易发生变化的DB连接信息抽取出来封装在Properties里面,这样需要修改时,只需修改Properties就行了,也不需要重新编译。在后来就是把Properties改为XML的了,也许是我太喜欢赶流行的原因吧,其实DB连接信息配置还没有达到需要XML的地步,不过也好,可以借机学习一下怎么进行XML解析...下面是网上的一篇很好的文章,大家可以借鉴一下。
     原文链接:http://www.jdon.com/idea/xml.htm   板桥里人 jdon.com 2002/2    
     Java和XML是黄金组合,网上已经有很多文章介绍,XML作为电子商务中数据交换,已经有其不可替代的作用,但是在平时系统开发中,我们不一定都用到数据交换,是不是无法使用XML了?当然不是,现在已经有一个新趋势,Java程序的配置文件都开始使用XML格式,以前是使用类似windows的INI格式(Java中也有Propertiesy这样的类专门处理这样的属性配置文件)。使用XML作为Java的配置文件有很多好处,从Tomcat的安装配置文件和J2ee的配置文件中,我们已经看到XML的普遍应用,让我们也跟随流行趋势用XML武装起来。
     现在关键是如何读取XML配置文件?有好几种XML解析器:主要有DOM和SAX ,这些区别网上文章介绍很多。
     在Apache的XML项目组中,目前有Xerces、Xalan、Cocoon几个开发XML相关技术的project。Tomcat本身使用的是Sun的JAXP,而其XSL Taglib project中使用Xerces解析器。好了,上面都是比较烦人的理论问题,还是赶快切入XML的配置文件的读取吧。在我们的程序中,通常要有一些根据主机环境确定的变量。比如数据库访问用户名和密码,不同的主机可能设置不一样。只要更改XML配置文件就可以正常运行。

  1. <myenv>  
  2.     <datasource>  
  3.          <dbhost>localhostdbhost>  
  4.          <dbname>sqlnamedbname>  
  5.          <dbuser>usernamedbuser>  
  6.          <dbpassword>passworddbpassword>  
  7.     datasource>  
  8. myenv>  

      上面这个myenv.xml配置文件一般是放在tomcat的WEB-INF/classes目录下。
      我们编制一个Java程序直接读取,将dbhost、dbuser、dbpassword提取出来供其他程序访问数据库用。
      目前使用SAX比较的多,与DOM主要区别是SAX是一行一行读取XML文件进行分析,适合比较大文件,DOM是一次性读入内存,显然不能对付大文件这里我们使用SAX解析,由于SAX解析器不断在发展,网上有不少文章是针对老版本的。如果你使用JDK1.4 ,可以参考使用SAX处理XML文档一文。这里的程序是根据其改进并且经过实践调试得来的。
      对上面myenv.xml读取的Java程序:

  1. import org.xml.sax.Attributes;   
  2. import org.xml.sax.helpers.DefaultHandler;   
  3. import org.xml.sax.SAXException;    
  4. import java.util.Properties;   
  5.     
  6. //使用DefaultHandler的好处是不必陈列出所有方法   
  7. public class ConfigParser extends DefaultHandler {   
  8.       //定义一个Properties用来存放dbhost、dbuser、dbpassword的值   
  9.       private Properties props;   
  10.       private String currentSet;   
  11.       private String currentName;   
  12.       private StringBuffer currentValue = new StringBuffer();   
  13.       //构建器初始化props   
  14.       public ConfigParser() {   
  15.           this.props = new Properties();   
  16.       }   
  17.       public Properties getProps() {   
  18.           return this.props;   
  19.       }   
  20.       //定义开始解析元素的方法. 这里是将<xxx></xxx>中的名称xxx提取出来.   
  21.       public void startElement(String uri, String localName, String qName, Attributes attributes)    
  22.                       throws SAXException {   
  23.           currentValue.delete(0, currentValue.length());   
  24.           this.currentName =qName;   
  25.       }   
  26.       //这里是将<xxx></xxx>之间的值加入到currentValue   
  27.       public void characters(char[] ch, int start, int length) throws SAXException {    
  28.           currentValue.append(ch, start, length);   
  29.       }   
  30.       //在遇到结束后,将之前的名称和值一一对应保存在props中   
  31.       public void endElement(String uri, String localName, String qName) throws SAXException {   
  32.           props.put(qName.toLowerCase(), currentValue.toString().trim());   
  33.       }   
  34. }  

      上面的这个解析程序比较简单吧? 其实解析XML就是这么简单。
      现在我们已经将dbhost、dbuser、dbpassword的值localhost、sqlname、username、password提取了出来。但是这只是在在解析器内部,我们的程序还不能访问。需要再编制一个程序。注意这里需要将myenv.xml与ConfigParser.class置于同一目录之下。       

  1. import java.util.Properties;   
  2. import javax.xml.parsers.SAXParser;   
  3. import javax.xml.parsers.SAXParserFactory;   
  4. import java.net.URL;    
  5.   
  6. public class ParseXML{   
  7.       //定义一个Properties 用来存放 dbhost dbuser dbpassword的值   
  8.       private Properties props;   
  9.       public Properties getProps() {   
  10.           return this.props;   
  11.       }   
  12.       public void parse(String filename) throws Exception {   
  13.             //将我们的解析器对象化   
  14.             ConfigParser handler = new ConfigParser();   
  15.             //获取SAX工厂对象   
  16.             SAXParserFactory factory = SAXParserFactory.newInstance();   
  17.             factory.setNamespaceAware(false);   
  18.             factory.setValidating(false);   
  19.             //获取SAX解析   
  20.             SAXParser parser = factory.newSAXParser();   
  21.             //得到配置文件myenv.xml所在目录. tomcat中是在WEB-INF/classes   
  22.             //下例中BeansConstants是用来存放xml文件中配置信息的类,可以自己代替   
  23.             URL confURL = ConfigParser.class.getResource(filename);   
  24.             try {   
  25.                   //将解析器和解析对象myenv.xml联系起来,开始解析    
  26.                    parser.parse(confURL.toString(), handler);    
  27.                   //获取解析成功后的属性 以后我们其他应用程序   
  28.                   //只要调用本程序的props就可以提取出属性名称和值了   
  29.                    props = handler.getProps();   
  30.             } finally {   
  31.                    factory=null;   
  32.                    parser=null;   
  33.                    handler=null;   
  34.             }   
  35.       }   
  36. }   

     由于我们的XML文件是使用最简单的形式,因此解析器相对简单,但是这已经足够对付我们的配置文件了。判断一个程序系统的先进性,我们先看看他的配置文件,如果还在使用老套的xxx=123这样类似.ini的文件,我们也许会微微一笑,他又落伍了.....

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics