《一: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);
}
}
}