java xml 解析

最近,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();
        }
               
    }

}

我連數據庫連接,測試類,一股腦上來了,希望能幫到那些有需要的兄弟~~~~

發佈了12 篇原創文章 · 獲贊 0 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章