利用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>
<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);
}
}
}
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);
}
}
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();
}
}
}
}
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();
}
}
}
}
- 利用sax工具读取xml文件
- 利用SAX解析读取XML文件
- 利用SAX解析读取XML文件
- SAX 读取xml文件
- SAX读取XML文件
- 使用SAX读取XML文件
- Android SAX读取XML文件
- 使用SAX读取XML文件
- SAX方式读取XML文件
- 使用SAX读取XML文件
- 利用SAX解析xml文件
- Java读取XML文件之SAX篇
- android 实用sax 读取xml文件内容
- Android --- 使用SAX读取xml文件
- android 实用sax 读取xml文件内容
- Android使用SAX读取XML文件内容
- android中使用SAX读取XML文件
- Android 使用SAX读取XML文件
- 使用.NET访问Internet(4)
- 使用.NET 异步编程(2)
- 在.NET中的线程处理(4)
- 对list排序
- 在.NET中的线程处理(6)
- 利用sax工具读取xml文件
- 新事务之一: dotNET和COM+中的事务(1)
- 新事务之一: dotNET和COM+中的事务(2)
- 防火墙的选择
- Auto Complete combo Box(VB.NET Source Use API)
- 在LINUX系统下安装RTL8111/8168网卡驱动程序
- The MD4 Class.(C#)
- C#学习笔记(四)
- WPF中嵌入普通Win32程序的方法