码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-08-14 10:10:19      阅读:233      评论:0      收藏:0      [点我收藏+]

标签:

============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;
	}
	@Override
	public 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的contact
			Element 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) {
		//测试UUID
		String 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;
	
	/**
	 * 初始化对象实例
	 */
	@Before
	public void init(){
		operator = new ContactDaoImpl();
	}
	

	@Test
	public 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);
	}
	
	@Test
	public void testUpdateContact(){
		Contact contact = new Contact();
		contact.setId("1"); //修改的ID
		contact.setName("李四");
		contact.setGender("女");
		contact.setAge(30);
		contact.setPhone("135222233333");
		contact.setEmail("zhangsan@qq.com");
		contact.setQq("33334444");
		operator.updateContact(contact);
	}
	
	@Test
	public void testDeleteContact(){
		operator.deleteContact("2");
	}
	
	@Test
	public void testFindAll(){
		List<Contact> list = operator.findAll();
		for (Contact contact : list) {
			System.out.println(contact);
		}
	}
	
	@Test
	public void testFindById(){
		Contact contact = operator.findById("1");
		System.out.println(contact);
	}
	
	@Test
	public void testCheckContact(){
		System.out.println(operator.checkContact("王五1"));
	}
}

  

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

标签:

原文地址:http://www.cnblogs.com/cxspace/p/5769545.html

(0)
(1)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!