利用sax工具读取xml文件

    技术2022-05-11  21

    写这篇东西主要是为了完成上回写的“用策略模式实现对数据库的增删改操作”一文,这里仍然使用上次使用过的反射机制来实现。这次之所以将操作类写在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)