利用sax工具读取xml文件

      写这篇东西主要是为了完成上回写的“用策略模式实现对数据库的增删改操作”一文,这里仍然使用上次使用过的反射机制来实现。这次之所以将操作类写在xml中是为了在前端真正的实现对后台操作的抽象,这样的好处是可以更灵活的实现对后台扩展而不用修改现有代码,也就是说更加符合“开-闭”原则。
     这里的xml读取之所以采用的sax工具,其实主要是想试一试这个“ 民间标准”的手感(毕竟以前对事件处理机制接触不多)。至于读取的过程,采用单例模式管理是为了更有效的读取xml文件:如果文件在读取之前被修改则重新读取,否则直接读取上次读取的结果。
该例中使用的xml文件(myxml.xml)
<?xml version="1.0" encoding="gb2312"?>
<myxml>
  <database>
    <insert>com.Insert</insert>
    <delete>com.Delete</delete>
    <updata>com.Updata</updata>
  </database>
</myxml>
下面是源代码(策略类和数据库操作类可参见“用策略模式实现对数据库的增删改操作”一文):
SAXHandler类(解析xml文件的核心类)
package  com;

import  java.util. * ;
import  org.xml.sax.helpers.DefaultHandler;
import  org.xml.sax.SAXException;
import  org.xml.sax.Attributes;

class  SAXHandler
    
extends  DefaultHandler  {
  
private Stack<String> stack = new Stack<String> ();
  
private Map<String, String> map = new HashMap<String, String> ();
  
private String currentElement = null;
  
private String currentValue = null;
  
public Map<String,String> getMap(){
    
return map;
  }

  
public void characters(char ch[], int start, int length) throws SAXException {
    currentValue 
= new String(ch, start, length);
  }


  
public void startElement(String uri, String localName, String qName,
                           Attributes attributes) 
{
    currentElement 
= qName;
    stack.push(qName);
  }


  
public void endElement(String uri, String localName, String qName) {
    stack.pop();
    
if (!stack.empty() &&stack.peek().equalsIgnoreCase("database")) {
      map.put(currentElement, currentValue);
    }

  }

}

 

XMLManager类(单例模式管理解析过程的类)
package  com;

import  javax.xml.parsers.SAXParserFactory;
import  javax.xml.parsers.SAXParser;
import  java.io.File;
import  java.util.Map;

public   class  XMLManager  {
  
private String xmlpath = new String("myxml.xml");
  
private File xmlfile = null;
  
private long lastmodifiedtime = 0;
  
private SAXHandler saxhandler = null;
  
private SAXParserFactory saxparserfactory = null;
  
private SAXParser saxparser = null;
  
private Map<String, String> map = null;
  
private static XMLManager xmlmanager = new XMLManager();
  
private XMLManager() {
    xmlfile 
= new File(xmlpath);
    lastmodifiedtime 
= xmlfile.lastModified();
    saxhandler 
= new SAXHandler();
    
try {
      saxparserfactory 
= SAXParserFactory.newInstance();
      saxparser 
= saxparserfactory.newSAXParser();
      saxparser.parse(xmlfile, saxhandler);
      map 
= saxhandler.getMap();
    }

    
catch (Exception ex) {
      ex.printStackTrace();
    }

  }


  
public static XMLManager newInstance() {
    
return xmlmanager;
  }


  synchronized 
public String getValue(String key) {
    
long newtime = xmlfile.lastModified();
    
if (newtime == 0{
      
if (lastmodifiedtime == 0{
        System.out.println(
"file dose not exist!");
      }

      
else {
        System.out.println(
"file was deleted!");
      }

      
return "";
    }

    
else if (newtime > lastmodifiedtime) {
      
try {
        saxparser.parse(xmlfile, saxhandler);
        map 
= saxhandler.getMap();
      }

      
catch (Exception ex) {
        ex.printStackTrace();
      }

    }

    lastmodifiedtime 
= newtime;
    
return map.get(key);
  }

}

test类(测试类)
package  com;

import  java.util.Map;
import  java.lang.reflect.Constructor;
import  java.util.HashMap;

public   class  test  {
  
public static void main(String[] args) {
    DataBaseContext dbc 
= new DataBaseContext();
    DataBaseSuper dbs 
= null;
    Map map 
= new HashMap();
    map.put(
"name""丁丁");
    map.put(
"age""14");
    String dboperate 
= XMLManager.newInstance().getValue("insert");
    
if (dboperate.equals(""|| dboperate == null{
      System.out.println(
"operate failed!");
    }

    
else {
      
try {
        
/** */
        
/***具体的反射实现过程***/
        Class cls 
= Class.forName(dboperate);
        Class partype 
= Class.forName("java.util.Map");
        Constructor ct 
= cls.getConstructor(partype);
        dbs 
= (DataBaseSuper) ct.newInstance(map);
      }

      
catch (Throwable ex) {
        System.err.println(ex);
      }

      
if (dbs != null{
        dbc.setOperate(dbs);
        dbc.excuteOperate();
      }

    }

  }

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值