XML学习总结-DOM和SAX解析-综合案例-(四)

来源:互联网 发布:nginx 1.10.2 编辑:程序博客网 时间:2021/06/19 13:56
============DOM解析    vs   SAX解析             ========

        

DOM解析

SAX解析

原理: 一次性加载xml文档,不适合大容量的文件读取

原理: 加载一点,读取一点,处理一点。适合大容量文件的读取

DOM解析可以任意进行增删改成

SAX解析只能读取

DOM解析任意读取任何位置的数据,甚至往回读

SAX解析只能从上往下,按顺序读取,不能往回读

DOM解析面向对象的编程方法(Node,Element,Attribute),Java开发者编码比较简单。

 

SAX解析基于事件的编程方法。java开发编码相对复杂。

 

xml技术学习综合案例

设计一个通讯录程序

 联系人: 编号  姓名  性别  年龄  电话  QQ 邮箱

 功能要求:

   添加联系人

   修改联系人

   删除联系人

   查询所有联系人

-在控制台操作

-数据存储到xml中

entity

package gz.itcast.contactSys_web.entity;/** * 实体对象 * @author APPle * */public class Contact {private String id;private String name;private String gender;private int age;private String phone;private String email;private String qq;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public String getQq() {return qq;}public void setQq(String qq) {this.qq = qq;}@Overridepublic String toString() {return "Contact [age=" + age + ", email=" + email + ", gender="+ gender + ", id=" + id + ", name=" + name + ", phone=" + phone+ ", qq=" + qq + "]";}}

  

dao

package gz.itcast.contactSys_web.dao;import gz.itcast.contactSys_web.entity.Contact;import java.util.List;/** * 联系人的DAO接口 * @author APPle * */public interface ContactDao {public void addContact(Contact contact);//添加联系人public void updateContact(Contact contact);//修改联系人public void deleteContact(String id);//删除联系人public List<Contact> findAll();  //查询所有联系人public Contact findById(String id);//根据编号查询联系人public boolean checkContact(String name);//根据姓名查询是否重复}

 

package gz.itcast.contactSys_web.dao.impl;import gz.itcast.contactSys_web.dao.ContactDao;import gz.itcast.contactSys_web.entity.Contact;import gz.itcast.contactSys_web.util.XMLUtil;import java.io.File;import java.util.ArrayList;import java.util.List;import java.util.UUID;import org.dom4j.Document;import org.dom4j.DocumentHelper;import org.dom4j.Element;public class ContactDaoImpl implements ContactDao {/** * 添加联系人 */public void addContact(Contact contact) {try {File file = new File("e:/contact.xml");Document doc = null;Element rootElem = null;if(!file.exists()){/** * 需求: 把contact对象保存到xml文件中 *///如果没有xml文件,则创建xml文件doc = DocumentHelper.createDocument();//创建根标签rootElem = doc.addElement("contactList");}else{//如果有xml文件,则读取xml文件doc = XMLUtil.getDocument();//如果有xml文件,读取根标签rootElem = doc.getRootElement();}//添加contact标签/** * <contact id="1"><name>eric</name><gender>男</gender><age>20</age><phone>1343333</phone><email>eric@qq.com</email><qq>554444</qq></contact> */Element contactElem = rootElem.addElement("contact");/** * 由系统自动生成随机且唯一的ID值,赋值给联系人 */String uuid = UUID.randomUUID().toString().replace("-","");contactElem.addAttribute("id", uuid);contactElem.addElement("name").setText(contact.getName());contactElem.addElement("gender").setText(contact.getGender());contactElem.addElement("age").setText(contact.getAge()+"");contactElem.addElement("phone").setText(contact.getPhone());contactElem.addElement("email").setText(contact.getEmail());contactElem.addElement("qq").setText(contact.getQq());//把Document写出到xml文件XMLUtil.write2xml(doc);} catch (Exception e) {e.printStackTrace();throw new RuntimeException(e);}}/** * 删除联系人 */public void deleteContact(String id) {try {//1.读取xml文件Document doc = XMLUtil.getDocument();//2.查询需要删除id的contactElement contactElem = (Element)doc.selectSingleNode("//contact[@id='"+id+"']");//删除标签if(contactElem!=null){contactElem.detach();}//3.把Document写出到xml文件XMLUtil.write2xml(doc);} catch (Exception e) {e.printStackTrace();throw new RuntimeException(e);}}/** * 查询所有联系人 */public List<Contact> findAll() {//1.读取xml文件Document doc = XMLUtil.getDocument();//2.创建List对象List<Contact> list = new ArrayList<Contact>();//3.读取contact标签List<Element> conList = (List<Element>)doc.selectNodes("//contact");for(Element e:conList){//创建COntact对象Contact c = new Contact();c.setId(e.attributeValue("id"));c.setName(e.elementText("name"));c.setGender(e.elementText("gender"));c.setAge(Integer.parseInt(e.elementText("age")));c.setPhone(e.elementText("phone"));c.setEmail(e.elementText("email"));c.setQq(e.elementText("qq"));//把Contact放入list中list.add(c);}return list;}/** * 根据编号查询联系人 */public Contact findById(String id) {Document doc = XMLUtil.getDocument();Element e = (Element)doc.selectSingleNode("//contact[@id='"+id+"']");Contact c = null;if(e!=null){//创建COntact对象c = new Contact();c.setId(e.attributeValue("id"));c.setName(e.elementText("name"));c.setGender(e.elementText("gender"));c.setAge(Integer.parseInt(e.elementText("age")));c.setPhone(e.elementText("phone"));c.setEmail(e.elementText("email"));c.setQq(e.elementText("qq"));}return c;}/** * 修改联系人 */public void updateContact(Contact contact) {/** * 需求: 修改id值为2的联系人 * 1)查询id值为2的contact标签 *  2)修改contact标签的内容 */try {//1.读取xml文件Document doc = XMLUtil.getDocument();Element contactElem = (Element)doc.selectSingleNode("//contact[@id='"+contact.getId()+"']");//2.修改contact标签内容contactElem.element("name").setText(contact.getName());contactElem.element("gender").setText(contact.getGender());contactElem.element("age").setText(contact.getAge()+"");contactElem.element("phone").setText(contact.getPhone());contactElem.element("email").setText(contact.getEmail());contactElem.element("qq").setText(contact.getQq());//3.把Document写出到xml文件XMLUtil.write2xml(doc);} catch (Exception e) {e.printStackTrace();throw new RuntimeException(e);}}public static void main(String[] args) {//测试UUIDString uuid = UUID.randomUUID().toString().replace("-","");System.out.println(uuid);}/** * true:重复 * false:不重复 */public boolean checkContact(String name) {//查询name标签的内容和传入的name值是否一致?Document doc = XMLUtil.getDocument();Element nameElem = (Element)doc.selectSingleNode("//name[text()='"+name+"']");if(nameElem!=null){return true;}else{return false;}}}

service

package gz.itcast.contactSys_web.service;import gz.itcast.contactSys_web.entity.Contact;import gz.itcast.contactSys_web.exception.NameRepeatException;import java.util.List;public interface ContactService {public void addContact(Contact contact)throws NameRepeatException;//添加联系人public void updateContact(Contact contact);//修改联系人public void deleteContact(String id);//删除联系人public List<Contact> findAll();  //查询所有联系人public Contact findById(String id);//根据编号查询联系人}

  

package gz.itcast.contactSys_web.service.impl;import gz.itcast.contactSys_web.dao.ContactDao;import gz.itcast.contactSys_web.dao.impl.ContactDaoImpl;import gz.itcast.contactSys_web.entity.Contact;import gz.itcast.contactSys_web.exception.NameRepeatException;import gz.itcast.contactSys_web.service.ContactService;import java.util.List;/** * 业务逻辑层 * 处理项目中出现的业务逻辑 * @author APPle * */public class ContactServiceImpl implements ContactService {ContactDao dao = new ContactDaoImpl();public void addContact(Contact contact) throws NameRepeatException {//执行业务逻辑判断if(dao.checkContact(contact.getName())){//重复/** * 注意: 如果业务层方法出现任何业务异常,则返回标记(自定义异常)到servlet */throw new NameRepeatException("姓名重复,不可使用");}//如果不重复,才执行添加方法dao.addContact(contact);}public void deleteContact(String id) {dao.deleteContact(id);}public List<Contact> findAll() {return dao.findAll();}public Contact findById(String id) {return dao.findById(id);}public void updateContact(Contact contact) {dao.updateContact(contact);}}

  

工具类

package gz.itcast.contactSys_web.util;import java.io.File;import java.io.FileOutputStream;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.io.OutputFormat;import org.dom4j.io.SAXReader;import org.dom4j.io.XMLWriter;/** * xml的工具类 * @author APPle * */public class XMLUtil {/** * 读取xml文档方法 * @return */public static Document getDocument(){try {Document doc = new SAXReader().read(new File("e:/contact.xml"));return doc;} catch (DocumentException e) {e.printStackTrace();throw new RuntimeException(e);}}/** * 写出到xml文档中 */public static void write2xml(Document doc){try {FileOutputStream out = new FileOutputStream("e:/contact.xml");OutputFormat format = OutputFormat.createPrettyPrint();format.setEncoding("utf-8");XMLWriter writer = new XMLWriter(out,format);writer.write(doc);writer.close();} catch (Exception e) {e.printStackTrace();throw new RuntimeException(e);}}}

  

测试类

package gz.itcast.contactSys_web.test;import gz.itcast.contactSys_web.dao.ContactDao;import gz.itcast.contactSys_web.dao.impl.ContactDaoImpl;import gz.itcast.contactSys_web.entity.Contact;import java.util.List;import org.junit.Before;import org.junit.Test;/** * 联系人操作实现类的测试类 * @author APPle * */public class TestContactOperatorImpl {ContactDao operator = null;/** * 初始化对象实例 */@Beforepublic void init(){operator = new ContactDaoImpl();}@Testpublic void testAddContact(){Contact contact = new Contact();//contact.setId("2");contact.setName("张三2");contact.setGender("男");contact.setAge(20);contact.setPhone("134222233333");contact.setEmail("eric@qq.com");contact.setQq("33334444");operator.addContact(contact);}@Testpublic void testUpdateContact(){Contact contact = new Contact();contact.setId("1"); //修改的IDcontact.setName("李四");contact.setGender("女");contact.setAge(30);contact.setPhone("135222233333");contact.setEmail("zhangsan@qq.com");contact.setQq("33334444");operator.updateContact(contact);}@Testpublic void testDeleteContact(){operator.deleteContact("2");}@Testpublic void testFindAll(){List<Contact> list = operator.findAll();for (Contact contact : list) {System.out.println(contact);}}@Testpublic void testFindById(){Contact contact = operator.findById("1");System.out.println(contact);}@Testpublic void testCheckContact(){System.out.println(operator.checkContact("王五1"));}}

  

0 0