利用sax工具读取xml文件

来源:互联网 发布:网络外卖加盟店排行榜 编辑:程序博客网 时间:2024/05/16 19:42
      写这篇东西主要是为了完成上回写的“用策略模式实现对数据库的增删改操作”一文,这里仍然使用上次使用过的反射机制来实现。这次之所以将操作类写在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();
      }

    }

  }

}

原创粉丝点击