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); } } }
相关文章推荐
- 【JAVA解析XML文件实现CRUD操作】
- Java Web JDBC实现CRUD操作总结(二)
- 【JAVA使用XPath、DOM4J解析XML文件,实现对XML文件的CRUD操作】
- JavaWeb 之 XML文档的DOM和SAX解析方式详解
- AngularJS实现与Java Web服务器交互操作示例【附demo源码下载】
- Web后台开发之CRUD操作的两种实现
- JAVA实现DAO基本层CRUD操作
- java网络编程--解析通过web.xml文件控制利用过滤器实现编码格式步骤
- JAVAWEB开发之mybatis详解(一)——mybatis的入门(实现增删改查操作)、自定义别名、抽取代码块以及动态SQL的使用
- Java xml 操作(Dom4J修改xml   + xPath技术  + SAX解析 + XML约束)
- java实现对HDFS增删改查(CRUD)等操作
- javaWeb-javaBean+内省机制+模拟Hibernate的CRUD操作
- JavaWeb 登陆操作和注册操作的实现
- Javaweb开发,实现'购物车'的遍历与操作(页面数据刷新、后台操作反馈)
- android客户端+JAVA WEB服务器实现json数据解析
- JavaWeb 之 XML文档的DOM和SAX解析方式详解
- JavaWeb - XML解析 - SAX
- java实现对HDFS增删改查(CRUD)等操作
- Java xml 操作(Dom4J修改xml   + xPath技术  + SAX解析 + XML约束)
- JAVA实现DAO层基本CRUD操作