Aladdin的思考
来源: BlogBus 原始链接: http://leon.cc.blogbus.com:80/logs/2006/10/t3702477.html 存档链接: https://web.archive.org/web/20061115200158id_/http://leon.cc.blogbus.com:80/logs/2006/10/t3702477.html
XML配置文件的读取处理 2006-10-27, by leon_jlu 让我们先来聊聊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解析...下面是网上的一篇很好的文章,大家可以借鉴一下。 原文链接: 板桥里人 www.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配置文件就可以正常运行。 localhost sqlname username password 上面这个myenv.xml配置文件一般是放在tomcat的WEB-INF/classes目录下。我们编制一个Java程序直接读取,将dbhost、dbuser、dbpassword提取出来供其他程序访问数据库用。 目前使用SAX比较的多,与DOM主要区别是SAX是一行一行读取XML文件进行分析,适合比较大文件,DOM是一次性读入内存,显然不能对付大文件这里我们使用SAX解析,由于SAX解析器不断在发展,网上有不少文章是针对老版本的。如果你使用JDK1.4 ,可以参考使用SAX处理XML文档一文。这里的程序是根据其改进并且经过实践调试得来的。对上面myenv.xml读取的Java程序: import org.xml.sax.Attributes; import org.xml.sax.helpers.DefaultHandler; import org.xml.sax.SAXException; import java.util.Properties; public class ConfigParser extends DefaultHandler { private Properties props; private String currentSet; private String currentName; private StringBuffer currentValue = new StringBuffer(); public ConfigParser() { this.props = new Properties(); } public Properties getProps() { return this.props; } public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { currentValue.delete(0, currentValue.length()); this.currentName =qName; } public void characters(char[] ch, int start, int length) throws SAXException { currentValue.append(ch, start, length); } public void endElement(String uri, String localName, String qName) throws SAXException { props.put(qName.toLowerCase(), currentValue.toString().trim()); } } 上面的这个解析程序比较简单吧? 其实解析XML就是这么简单。 现在我们已经将dbhost、dbuser、dbpassword的值localhost、sqlname、username、password提取了出来。但是这只是在在解析器内部,我们的程序还不能访问。需要再编制一个程序。注意这里需要将myenv.xml与ConfigParser.class置于同一目录之下。 import java.util.Properties; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import java.net.URL; public class ParseXML { private Properties props; public Properties getProps() { return this.props; } public void parse(String filename) throws Exception { ConfigParser handler = new ConfigParser(); SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setNamespaceAware(false); factory.setValidating(false); SAXParser parser = factory.newSAXParser(); URL confURL = ConfigParser.class.getResource(filename); try { parser.parse(confURL.toString(), handler); props = handler.getProps(); } finally { factory=null; parser=null; handler=null; } } } 由于我们的XML文件是使用最简单的形式,因此解析器相对简单,但是这已经足够对付我们的配置文件了。判断一个程序系统的先进性,我们先看看他的配置文件,如果还在使用老套的xxx=123这样类似.ini的文件,我们也许会微微一笑,他又落伍了..... 发布于: 11:23:12 | 分类: JAVA之道 | 评论(0) | Edit Trackback URL: http://www.blogbus.com/public/tb.php/3702477 以下Blog引用了本文