《一:SAX解析》
一:介绍:
1. 简介:SAX是Simple API for XML 的简称,最先出现在java上
2. 相关包位置:org. xml . sax
3. 性质:基于事件机制,也提供了基于事件的xml 解析的API
4. 工作过程:SAX解析器是从文件的开头出发,从前向后解析,
每当遇到 起始标记或者结束标记,属性,文本或者其他xml 语法
时,就会触发事件。
5. 开发者任务:在相应的事件方法中,编写相应代码.
6. 缺点:编码不直观,只能对xml 文件进行度,无法进行修改;
无法随机访问,查找繁琐。
7. 优点:和DOM解析相比,用SAX解析xml 文件,无需将文档读入内存,
速度快。
二:解析过程:
1. 载入文档:
SAXParserFactory spf = SAXParserFactory. newInstance();
SAXParser sp = spf. newSAXParser();
2. 将XML 文件与DefaultHandler(只用一次可用匿名内部类)绑定:
sp. parse(xml 文件名, DefaultHandler对象 );
3. DefaultHandler简介:
3.1 :DefaultHandler是最常用的SAX处理器,实现了ContentHandler等接口
3.2 :SAX解析XML 文件最终要的类是ContentHandler;
3.3 :contentHandler类的方法在解析xml 文件过程中自动触发事件来调用
三:DefaultHandler类中常用的方法:
startDocument : 文档开始时自动调用
startElement : qName:元素名称,attribute:属性
characters : 当遇到元素中的字符数据(空字符也算)时,自动调用,触法事件
endElement : 读取元素结束时调用
endDocument : 文档结束时,自动调用
四:利用SAX实现DAO中的getAll方法:
public List<Employee> getAll () {
try {
final List<Employee> list = new ArrayList<>();
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser ps = spf.newSAXParser();
ps.parse("emp.xml" , new DefaultHandler() {
Employee emp;
String tagName;
public void startElement (String uri, String localName,
String qName, Attributes attributes)
throws SAXException {
tagName = qName;
if ("emp" .equals(qName)) {
emp = new Employee();
list.add(emp);
emp.setId(attributes.getValue("id" ));
}
}
public void endElement (String uri, String localName,
String qName) throws SAXException {
tagName = null ;
}
public void characters (char [] ch, int start, int length)
throws SAXException {
String data = new String(ch, start, length);
if ("name" .equals(tagName)) {
emp.setName(data);
} else if ("age" .equals(tagName)) {
emp.setAge(Integer.valueOf(data));
} else if ("dept" .equals(tagName)) {
emp.setDept(data);
} else if ("intro" .equals(tagName)) {
emp.setIntro(data);
} else if ("fav" .equals(tagName)) {
emp.getFavs().add(data);
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
《DOM解析》
File f = new File ("E:/java/code/javaApps/employee/emps.xml" );
1.添加一个员工对象
public void add (Employee obj) {
//1. 获取Document对象
Document dom = DOMUtil.newInstance ().getDoc (f)
//2. 创建元素
Element empEl = dom.createElement ("emp" )
Element nameEl = dom.createElement ("name" )
Element ageEl = dom.createElement ("age" )
Element deptEl = dom.createElement ("dept" )
Element introEl = dom.createElement ("intro" )
Element favsEl = dom.createElement ("favs" )
//3. 设置元素值
String id = obj.getId ()
if (id == null) {
id = UUID.randomUUID ().toString ().substring (0 , 5 )
}
empEl.setAttribute ("id" , id)
nameEl.setTextContent (obj.getName ())
ageEl.setTextContent (obj.getAge () + "" )
deptEl.setTextContent (obj.getDept ())
introEl.setTextContent (obj.getIntro ())
for (int i = 0
Element favEl = dom.createElement ("fav" )
favEl.setTextContent (obj.getFavs ().get (i))
favsEl.appendChild (favEl)
}
//4 、组装成xml结构
empEl.appendChild (nameEl)
empEl.appendChild (ageEl)
empEl.appendChild (deptEl)
empEl.appendChild (introEl)
empEl.appendChild (favsEl)
dom.getDocumentElement ().appendChild (empEl)
//5. 将数据同步到xml文件中
DOMUtil.newInstance ().transform (dom)
}
2.删除一个员工对象
public void remove (String id) {
Document dom = DOMUtil.newInstance().getDoc(f);
NodeList nodeList = dom.getElementsByTagName("emp" );
for (int i = 0 ; i < nodeList.getLength(); i++) {
Element empEl = (Element) nodeList.item(i);
String attrId = empEl.getAttribute("id" );
if (attrId.equals(id)) {
empEl.getParentNode().removeChild(empEl);
DOMUtil.newInstance().transform(dom);
return ;
}
}
}
3.更新一个员工对象信息
public void update (Employee newObj) {
this .remove(newObj.getId());
this .add(newObj);
}
4.根据id得到一个员工对象信息
public Employee get(String id) {
//1. 获取Document对象
Document dom = DOMUtil.newInstance ().getDoc (f)
//2. 获取获得xml中所有的节点
NodeList list = dom.getElementsByTagName ("emp" )
Employee employee = null
//3. 找到符合条件的Element,封装到对象中返回
for (int i = 0
Element empEl = (Element) list.item (i)
String empId = empEl.getAttribute ("id" )
if (empId.equals (id)) {
employee = new Employee()
String name = empEl.getElementsByTagName ("name" ).item (0 )
.getTextContent ()
String age = empEl.getElementsByTagName ("age" ).item (0 )
.getTextContent ()
String dept = empEl.getElementsByTagName ("dept" ).item (0 )
.getTextContent ()
String intro = empEl.getElementsByTagName ("intro" ).item (0 )
.getTextContent ()
List<String> favsList = new ArrayList<>()
NodeList favs = empEl.getElementsByTagName ("fav" )
for (int j = 0
String fav = favs.item (j).getTextContent ()
favsList.add (fav)
}
employee.setId (id)
employee.setName (name)
employee.setAge (Integer.valueOf (age))
employee.setDept (dept)
employee.setIntro (intro)
employee.setFavs (favsList)
return employee
}
}
return null
}
5.DOMUtil
package cn.itcast.cd.oa.utils;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
public class DOMUtil {
private DOMUtil () {
}
public static DOMUtil newInstance (){
return new DOMUtil();
}
public Document getDoc (File f) {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = null ;
try {
db = dbf.newDocumentBuilder();
Document doc = db.parse(new File(
"E:/java/code/javaApps/employee/emps.xml" ));
return doc;
} catch (Exception e) {
throw new RuntimeException("获取文档对象失败" , e);
}
}
public void transform (Document dom) {
TransformerFactory tf = TransformerFactory.newInstance();
try {
Transformer trans = tf.newTransformer();
Source source = new DOMSource(dom);
Result result = new StreamResult(new File("E:/java/code/javaApps/employee/emps.xml" ));
trans.transform(source, result);
} catch (Exception e) {
throw new RuntimeException("同步操作失败" , e);
}
}
}