最近,TL叫我做公司项目的技术积累。今天叫我完成下用SAX解析器解析XML配置文件。原来我一直是做的.net项目。最近刚转到Java组里来。我想。TL是不是有待我啊。给了我一份闲差,我开心。.net中解析个XML,实在是很舒服。三两下就搞定的。我一直觉得Java和.net没什么根本上的差异的。于是。我便不紧不慢的做着。首先上网过google一下,好多的文章。我是在开心。可是当我看了10分钟后,我郁闷。发现几乎所有的都是一样的。而且我调了好久,愣是没调出来。于是我决定自己写。相信别人,不如信自己的。一番奋战,终于搞定,分享一下吧。代码如下:
/*
* 从XML文件中读取配置信息,并通过配置信息返回数据库连接
*
*/
package com.augow.xmlconfigreader;
import org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.SAXException;
import java.util.Properties;
/*
* SAX方式用于解析XML文件的解析器
*/
public class ConfigParser extends DefaultHandler
{
/*props:用于存放解析器解析出来的的节点和节点对应的属性,为哈希表
* currentName:当前节点的名称
* currentValue:用于存放当前节点所对应的属性值
*/
private Properties props;
private String currentName;
private StringBuffer currentValue = new StringBuffer();
public ConfigParser()
{
this.props=new Properties();
}
public Properties getPrpos()
{
return this.props;
}
public String getCurrentName()
{
return currentName;
}
/*
* 读取<xxx>中的值xxx并将其付给qname,通知解析器解析当前节点对应的值。同时对currentValue缓冲器清空,用来保存当前qname对应属性值。
* @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
*/
public void startElement(String uri,String localName,String qName,Attributes attributes)
throws SAXException
{
currentValue.delete(0,currentValue.length());
this.currentName=qName;
}
/*读取<xxx></xxx>之间的属性值,并将其首先以字符形式保存至字符数组ch中,并记录对应长度,以确保以
* length为长度的字符为一个整体,然后讲字符数组中的内容按照length长度为整体加到currentValue缓冲器中
* 每次读取xml文件后只会在ch中保存当前所解析到的值,currentValue中也只会有当前的节点所对应的唯一值
*/
public void characters(char[] ch,int start,int length)
throws SAXException
{
currentValue.append(ch,start,length);
}
/* 当遇到</xxx>时,将当前的qname,和qname所对应的位于currentValue缓冲器中的值保存到props这个哈希表中去,供外部程序调用
* @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String, java.lang.String, java.lang.String)
*/
public void endElement(String uri, String localName, String qName)
throws SAXException
{
props.put(qName.toLowerCase(), currentValue.toString().trim());
}
}
/*
* 从XML文件中读取配置信息,并通过配置信息返回数据库连接
*
*/
package com.augow.xmlconfigreader;
import java.util.Properties;
import java.net.URL;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
/*
* 用于实例化解析器,并利用解析器对XML文件进行解析并将解析结果返回,通过提供的获取结果的
* 方法供外部程序调用
*/
public class XmlReader
{
//用于存放解析结果的哈希表
private Properties props;
public XmlReader(String filename)
{
try
{
parse(filename);
}
catch(Exception e)
{
e.printStackTrace();
}
}
public Properties getProps()
{
return this.props;
}
/*
* 用于分析xml文件的方法
*/
public void parse(String filename)
throws Exception
{
//实例化解析器
ConfigParser handler = new ConfigParser();
//实例化用于分析的工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
//实例化分析类
SAXParser parser = factory.newSAXParser();
//得到xml文件对应的路径
URL confURL = XmlReader.class.getClassLoader().getResource(filename);
try
{
parser.parse(confURL.toString(), handler);
props = handler.getPrpos();
}
finally
{
/*
*销毁已过期对象
*/
factory=null;
parser=null;
handler=null;
}
}
/*
* 提供给外部程序调用的用于返回程序所对应需要的xml文件属性的方法
*/
public String getElementValue(String elementName)
{
//elementValue:对应于elementName的节点的属性值
String elementValue=null;
elementValue=props.getProperty(elementName);
return elementValue;
}
}
/*
* 从XML文件中读取配置信息,并通过配置信息返回数据库连接
*
*/
package com.augow.xmlconfigreader;
import java.sql.*;
/*
* 用于创建并返回由指定Xml配置文件所配置的数据库连接
*/
public class DBConnection
{
private static Connection conn=null;
public DBConnection(){}
/*
* 创建指定的数据库连接
*/
public static Connection CreateConnection()
{
XmlReader p=new XmlReader("XMLConfigure.xml");
try
{
/*
* 加入jdbc驱动包
*/
Class.forName(p.getElementValue("dbtype")).newInstance();
System.out.println("Success loading "+p.getElementValue("dbtype"));
}catch(Exception e)
{
System.out.println("Error loading "+p.getElementValue("dbtype"));
}
try
{
conn=DriverManager.getConnection("jdbc:mysql://"+
p.getElementValue("dbhost")+"/"+p.getElementValue("dbname")+
"?user="+p.getElementValue("dbuser")+"&password="+
p.getElementValue("dbpassword")+"&characterEncoding=gb2312");
System.out.println("Success connect Database!");
System.out.println("Success return a connection to the database!");
return conn;
}catch(SQLException e)
{
System.out.println(e.getMessage());
return null;
}
}
}
/*
* 从XML文件中读取配置信息,并通过配置信息返回数据库连接
*
*/
package com.augow.xmlconfigreader;
import java.sql.*;
/*
* 用于测试
*/
public class Test
{
private static Statement stat=null;
public static void main(String[] args)
{
Connection con=DBConnection.CreateConnection();
try
{
ResultSet rs = null;
stat= con.createStatement();
rs=stat.executeQuery("select sname from student where snum='0202'");
while(rs.next())
{
System.out.println(rs.getString("sname"));
}
con.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
我连数据库连接,测试类,一股脑上来了,希望能帮到那些有需要的兄弟~~~~