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

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

    }

}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值