最近,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();
}
}
}
我連數據庫連接,測試類,一股腦上來了,希望能幫到那些有需要的兄弟~~~~