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

============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>[email protected]</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("[email protected]");
		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("[email protected]");
		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"));
	}
}

  

时间: 2024-10-29 19:10:05

XML学习总结-DOM和SAX解析-综合案例-(四)的相关文章

XML - 十分钟了解XML结构以及DOM和SAX解析方式

引言 NOKIA 有句著名的广告语:"科技以人为本".不论什么技术都是为了满足人的生产生活须要而产生的.详细到小小的一个手机.里面蕴含的技术也是浩如烟海.是几千年来人类科技的结晶,单个人穷其一生也未必能掌握其一角.只是个人一直觉得主要的技术和思想是放之四海而皆准的,很多技术未必须要我们从头到尾再研究一遍.我们要做的就是站在巨人的肩膀上.利用其成果来为人们的需求服务. 随着移动互联网时代的大潮.越来越多的App不光是须要和网络server进行数据传输和交互,也须要和其它 App 进行数据

XML学习笔记(二):使用 DOM和SAX 解析XML :

一.XML解析的简介 1.一般来说xml解析的方式有两种,Dom与SAX,且各有优缺点.pull是第三种方法见:pull解析XML 1)DOM:dom对象树 ①.整个XML放入内存,转换为Document对象: ②.每个元素,转换成Element对象 ③.文本,转换成Text对象 ④.属性,转换成Attribute对象 优缺点:元素的CRUD比较简单,但是内存消耗大,大的xml文档不适合. 补充:内存不足时,可以修改参数,调整JVM的内存大小 1.java.lang.OutOfMemoryErr

DOM和SAX解析XML的区别

解析xml有四种方法:DOM,SAX,DOM4j,JDOM.     我们主要学了两种:DOM和SAX.     DOM适于解析比较简单的XML而SAX则适于解析较复杂的XML文件.各有各的好. DOM和SAX的不同:     1. DOM是基于内存的,不管文件有多大,都会将所有的内容预先装载到内存中.从而消耗很大的内存空间.而SAX是基于事件的.当某个事件被触发时,才获取相应的XML的部分数据,从而不管XML文件有多大,都只占用了少量的内存空间.     2. DOM可以读取XML也可以向XM

Java SE之XML&lt;二&gt;XML DOM与SAX解析

[文档整理系列] Java SE之XML<二>XML DOM与SAX解析 XML编程:CRUD(Create Read Update Delete) XML解析的两种常见方式: DOM(Document Object Model): 特点:树状解析 优点:[更适合对XML文档的(crud)操作.]对XML文档增删改查操作很方便灵活 缺点:内存消耗很大,不适合数据量很大,节点很多的XML文档. SAX(Simple API for XML): 特点:自上往下顺序解析 优点:[占用内存小,解析速度

iOS开发中XML的DOM和SAX解析方法

一.介绍 dom是w3c指定的一套规范标准,核心是按树形结构处理数据,dom解析器读入xml文件并在内存中建立一个结构一模一样的“树”,这树各节点和xml各标记对应,通过操纵此“树”来处理xml中的文件.xml文件很大时,建立的“树”也会大,所以会大量占用内存. sax解析器核心是事件处理机制.例如解析器发现一个标记的开始标记时,将所发现的数据会封装为一个标记开始事件,并把这个报告给事件处理器,事件处理器再调用方法(startElement)处理发现的数据.下面我们尝试一下SAX和DOM解析:

【Android高级】XMl文件的DOM、SAX、PULL三种解析方式全解

本来一直忙着期末考试的复习,但复习挺无聊的,偶然看到xml的解析方法,虽然以前做过,但感觉不是很熟悉了,所以抽点时间一口气把三种方式都复习了遍.这三种方法中DOM最耗内存,因为它是把整个文件加载进去然后进行分类整理的,PULL和SAX类似,只是SAX要用到一个解析类,类中的主要三个方法完成内容的解析,而PULL方法是Android特有的,根据获得的标签判断并解析,这也是安卓中最常使用的方法. 接下来给大家复习下,因为我觉得看代码更容易明白,讲解的就不多了. 首先我们准备好我们要解析的资源文件和封

2018/1/1 XML和DOM、SAX解析

1.XML (1)描述带关系的数据(软件的配置文件) (2)数据的载体(小型的"数据库")2.语法:标签: 标签名不能以数字开头,中间不能有空格,区分大小写.有且仅有一个根标签.属性: 可有多个属性,但属性值必须用引号(单引号或双引号)包含,但不能省略,也不能单双混用.文档声明: <?xml version="1.0" encoding="utf-8"?> encoding="utf-8": 打开或解析xml文档时

XML解析之DOM ,SAX解析区别

环境配置:导入GDataXMLNode.h 文件 1.导入GDataXMLNode.h 文件时,需要导入动态库 libxml2.2.tbd 动态库 , 2.再在Build setting下面找到 Header Search Paths ,插入 /usr/include/libxml2 3. 最后在Build Phases中的Compile Sources 下找到GDataXMLNode.m文件,在后面加上 -fno-objc-arc  因为这个三方是MRC环境的 SAX解析和DOM解析的区别:

XML解析之SAX解析技术案例

Java代码: package com.xushouwei.xml; import java.io.File; import java.io.IOException; import java.text.DateFormat; import java.text.SimpleDateFormat; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import java