============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