您的位置:首页 > 编程语言 > Java开发

javaWeb-SAX解析和DOM解析并实现CRUD操作

2017-10-06 16:22 288 查看

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

//1.得到SAX解析器的工厂对象
SAXParserFactory spf = SAXParserFactory.newInstance();
//2.利用SAX解析器工厂函数创建SAX解析器实例
SAXParser ps = spf.newSAXParser();
//3.将xml文件与SAX解析器绑定,并匿名内部类实现DefaultHandler中的方法
ps.parse("emp.xml", new DefaultHandler() {
Employee emp;
String tagName;

public void startElement(String uri, String localName,
String qName, Attributes attributes)
throws SAXException {
//4.每次记录当前元素的名称
tagName = qName;
//5.如果有当前员工的对象元素,放入集合中并且设置属性ID
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 {
//6.每次元素读取结束名称清空,以防影响下一轮解析
tagName = null;
}

//7.获取标签元素后的值,以字符串形式展现
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; i < obj.getFavs().size(); i++) {
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) {
//1.获取Document对象
Document dom = DOMUtil.newInstance().getDoc(f);

//2.获取获得xml中所有的节点
NodeList nodeList = dom.getElementsByTagName("emp");
//3.找到符合条件的Element,用它的父节点删除自己
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);

//5.将数据同步到xml文件中
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; i < list.getLength(); i++) {
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; j < favs.getLength(); j++) {
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);
}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  DOM和SAX解析