利用SAX解析器解析XML文件需要经过以下步骤:
1). 实例化一个SAXParserFactory对象:
SAXParserFactory factory = SAXParserFactory.newInstance();
2). 通过factory获得一个SAXParser对象,即SAX解析器:
SAXParser saxParser = factory.newSAXParser();
3). saxParser对象调用parse方法解析XML文件:
saxParser.parse(File file,DefaultHandler dh);
4). 编写继承DefaultHandler的子类
DefaultHandler的子类代码:
import java.util.HashMap;
import java.util.Map;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class XmlHandler extends DefaultHandler{
//用来临时存储从Xml中解析出来的字符串
private StringBuffer buffer = new StringBuffer();
//用来存储从Xml中读取到的字符串,键:Xml 文件中的元素名 值:元素值
//例:<driverClass>com.mysql.jdbc.Driver</driverClass>
//键:driverClass 值:com.mysql.jdbc.Driver
private Map<String, String> map = new HashMap<String, String>();
/**
* @return:返回存储着从 xml 文件中读取到的信息的 Map 容器
*/
public Map<String, String> getMap(){
return map;
}
@Override
public void startElement(String arg0, String arg1, String arg2, Attributes arg3) throws SAXException {
//遇到元素的开头时,清空字符数组
buffer.delete(0, buffer.length());
}
@Override
public void characters(char[] arg0, int arg1, int arg2) throws SAXException {
//读到元素值时,往字符数组里添加该元素值
buffer.append(arg0, arg1, arg2);
}
@Override
public void endElement(String arg0, String arg1, String arg2) throws SAXException {
//把该字符数组放到 map 容器里,args 参数为元素名
map.put(arg2, buffer.toString().trim());
}
}
解析主类代码:
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
public class XmlParser{
private static Map<String, String> map = null;
public static boolean parser(String xmlPath) {
boolean flag = false;
//获取当前工程的 classpath 的 绝对路径uri
String basePath = Thread.currentThread().getContextClassLoader().getResource("").getPath();
//basePath = /D:/Eclipse/eclipse/SalaryManager/build/classes/
//构建绝对路径
xmlPath = basePath + xmlPath;
try {
//定义工厂 API,使应用程序能够配置和获取基于 SAX 的解析器以解析 XML 文档
SAXParserFactory factory = SAXParserFactory.newInstance();
//使用当前配置的工厂参数创建 SAXParser 的一个新实例。
SAXParser saxParser = factory.newSAXParser();
File file = new File(xmlPath);
XmlHandler handler = new XmlHandler();
//使用指定的 Handler 将指定文件的内容解析为 XML
saxParser.parse(file, handler);
map = handler.getMap();
flag = true;
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
return flag;
}
public static Map<String, String> getParserMap(){
return map;
}
}