JAVA 通讯录 —— 实现对XML文件数据的增删改查

心血来潮,带着好奇写了人生中第一篇博客,哈哈哈哈 ~ 嗝 ~ ~

  这篇文章主要就是分享自己做的一次项目作业,一是为了分享,二是用另外一种方式保存自己的代码 嘻嘻嘻 ~。还是个编程萌新,所以有啥写的不好的地方请多多包涵、多多指教。下面进入正题:

  这个项目主要就是在 通过dom4j解析xml文件 ,在控制台实现一个对XML文件里的数据实现一个增删改查的功能。该项目 需要自行下载两个jar包 (dom4j.jarjaxen.jar)直接点击下载就好如果下载不了可以自行网上找一下,下载好后把它导入项目(导入方法看这里==>https://blog.csdn.net/believejava/article/details/41750987 )。 建议jdk使用8.0以上版本

项目结构图和控制台运行效果图:
项目结构
运行效果图

1、创建XML文件 (Contact.xml)

   在写xml文件时要 注意XML的语法 ,以及 前后标签的完整性,标签名可自行定义但后面java代码中引用时注意 保持一致 。这里我给了8条数据感觉有点多但是当运行出来实现查看功能是能够很清楚的看出其排序是怎样一个顺序。

<?xml version="1.0" encoding="utf-8"?>

<Contacts> 
	  <Contact id="1"> 
		    <name>李四</name>  
		    <del>123123</del> 
	  </Contact>  
 	 <Contact id="2"> 
		    <name>张三</name>  
		    <del>2312312</del> 
	  </Contact>  
	  <Contact id="3"> 
		    <name>王五值</name>  
		    <del>2312312</del> 
	  </Contact>  
	  <Contact id="4"> 
		    <name>王五迟</name>  
		    <del>2312312</del> 
	  </Contact>  
	  <Contact id="5"> 
		    <name>abc</name>  
		    <del>1342134</del> 
	  </Contact>   
	  <Contact id="6"> 
		    <name>汪五</name>  
		    <del>123124</del> 
	  </Contact>  
	  <Contact id="7"> 
		    <name>ABC</name>  
		    <del>021123</del> 
	  </Contact> 
	  <Contact id="8"> 
		    <name>陈二</name>  
		    <del>5435234</del> 
	  </Contact> 
</Contacts>

2、创建抽象类 (Person.java)

   Person抽象类主要是定义数据的类型,我一共定义了三个变量 编号=id、姓名=name、电话号码=del,三个变量都是String类型的,常规来说id应该是int类型,这里为了方便所以定义成了字符串型。


package contact;

public class Person {	//定义数据类型
	//属性定义
	private String id;	//编号
	private String name;	//姓名
	private String del;	//电话号码
	public Person() {
	
	}
	// 构造方法
	public Person(String id, String name, String del) {
		this.id = id;
		this.name = name;
		this.del = del;
	}
	// 成员方法
	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 getDel() {
		return del;
	}
	public void setDel(String del) {
		this.del = del;
	}
	@Override
	public String toString() {	//定义输出语句样式
		return "编号:" + id + " \t 姓名:" + name + " \t 电话号码:" + del;
	}
	
}

3、创建接口 (AddressListOPeration.java)

  该接口一共定义了5个处理XML文件的数据操作的抽象方法。定义接口使整个项目的逻辑更加清晰,更快捷的找到各个方法。


package contact;

import org.dom4j.Element;

public interface AddressListOPeration {	//定义了对XML文件的数据操作
	
	void addContact(Element ele) throws Exception;	//向在XML文件中增加联系人
	void deletContact(Element rootEle) throws Exception;	//删除XML文件中联系人信息
	void changeContact(Element rootEle) throws Exception;	//修改XML文件中联系人信息
	void checkContact(Element rootEle);	//查看XML文件中所有联系人(按姓名排序)
	void findContact(Element rootEle) throws Exception;//根据姓名查找联系人
}

4、创建接口实现类 (LinkAddressList.java)

  该类主要是在接口中定义的5个抽象方法,从而是该项目能够成功运行和实现。代码较多请仔细阅读,还是个萌新所以写的方法可能不够简便,功能实现上考虑不够全面,代码有待优化请多多指教。

package contact;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Locale;
import org.dom4j.Element;
import org.dom4j.Node;

public class LinkAddressList implements AddressListOPeration {	//实现接口中的操作
	
	//添加联系人
	@Override
	public void addContact(Element ele) throws Exception {	
		BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));	//读取控制台输入的文本
		System.out.print("请输入编号:");
		String id = bufr.readLine();
		System.out.print("请输入姓名:");
		String name = bufr.readLine();
		System.out.print("请输入电话:");
		String del = bufr.readLine();
 
		Element contact = ele.addElement("Contact");	//创建Contact标签
		contact.addAttribute("id", id);		//给标签添加id属性并赋上键入的id值
		contact.addElement("name").addText(name);	//添加name标签并赋上键入的name值
		contact.addElement("del").addText(del);		//添加del标签并赋上键入的del值
		System.out.println("添加完成!");
		
		//将添加的值封装到对象
		Person person=new Person();
		person.setId(id);
		person.setName(name);
		person.setDel(del);
		
	}
	
	//删除联系人
	@Override
	public void deletContact(Element rootEle) throws Exception {
		BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
		  System.out.print("请输入要删除的编号:");
			  String id = bufr.readLine(); 
			  Node node=rootEle.selectSingleNode("Contact[@id='"+id+"']");	//查找XML文件中与键入id值相匹配的一个节点
			  if(node!=null){
				  node.detach();	//移除被选元素及所包含的文本和子节点
				  System.out.println("删除成功!!");
			  }else {		//输入的编号没找到,提示并重新执行
				  System.out.println("查无此人!!");
				  System.out.print("请重新输入要删除的编号:");
				  String id2 = bufr.readLine(); 
				  node=rootEle.selectSingleNode("Contact[@id='"+id2+"']");
				  node.detach();	
				  System.out.println("删除成功!!");
			  }
	}
	
	//修改联系人信息
	@Override
	public void changeContact(Element rootEle) throws Exception {
		BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
		Person person=new Person();
		System.out.print("请输入要修改的编号:");
		String id = bufr.readLine();
		Node node = rootEle.selectSingleNode("Contact [@id='"+id+"']");
		if(node!=null) {
		System.out.print("请输入修改后的姓名:");
		String name = bufr.readLine();
		node.selectSingleNode("name").setText(name);	//查找XML文件中与name相匹配的一个节点并把文本修改为键入值
		System.out.print("请输入修改后的电话号码:");
		String del = bufr.readLine();
		node.selectSingleNode("del").setText(del);	//查找XML文件中与del相匹配的一个节点并把文本修改为键入值
		System.out.println("修改完毕!!");
		
		//将修改的值封装到对象
			person.setId(id);
			person.setName(name);
			person.setDel(del);
			
		}else {
			System.out.println("查无此编号!!");
			System.out.print("请重新输入要修改的编号:");
			String id2 = bufr.readLine();
			node = rootEle.selectSingleNode("Contact [@id='"+id2+"']");
			System.out.print("请输入修改后的姓名:");
			String name = bufr.readLine();
			node.selectSingleNode("name").setText(name);	//查找XML文件中与name相匹配的一个节点并把文本修改为键入值
			System.out.print("请输入修改后的电话号码:");
			String del = bufr.readLine();
			node.selectSingleNode("del").setText(del);	//查找XML文件中与del相匹配的一个节点并把文本修改为键入值
			System.out.println("修改完毕!!");
			
		//将修改的值封装到对象
			person.setId(id2);
			person.setName(name);
			person.setDel(del);
		}
	}
	
	//查看所有联系人
	@Override
	public void checkContact(Element rootEle) {
		List<Element> conlist = rootEle.elements();		//获取子节点
		List<Person> list = new ArrayList<Person>();	//创建数组
		 for(Element e : conlist) {		//遍历XML文件了的数据并存入List数组中
			 Person p=new Person();
			 p.setId(e.attributeValue("id"));
			 p.setName(e.elementText("name"));
			 p.setDel(e.elementText("del"));
			 list.add(p);
		 }
		 
		 //List中的中文属性按照拼音排序
		 list.sort((o1, o2) -> {	//  Lambda表达式
             Comparator<Object> cmp = Collator.getInstance(Locale.CHINA);
             return cmp.compare(o1.getName(), o2.getName());
         });

		 /*
		 Collections.sort(list,new Comparator<Person>() {
	            @Override
	            public int compare(Person o1, Person o2) {
	                return Collator.getInstance(Locale.CHINESE).compare(o1.getName(),o2.getName());
	            }
	        });
		 */
		 
		 //输出排序后的内容
		 for (Person person:list) {
	            System.out.println(person.toString());	//输出时调用Person抽象类里的toString方法
	        }
		 
		 /*无序输出
		for (int i = 0; i < list.size(); i++) { 
			  Element contact = (Element) list.get(i);
			  String id = contact.attributeValue("id"); 
			  List<Element> ll = contact.elements();
			  System.out.print("编号:"+id); 
		  for (int j = 0; j < ll.size(); j++) { 
			  Element element = (Element) ll.get(j); 
			  if ("name".equals(element.getName())) { 
				  String name = element.getText(); 
				  System.out.print("    姓名:"+name); 
				  } 
			  if("del".equals(element.getName())) { 
				  String del =element.getText();
				  System.out.print("    电话号码:"+del); 
				  }
			  } 
		  System.out.println(); 
		  }
		  */
	}
	//根据姓名查找联系人
	@Override
	public void findContact(Element rootEle) throws Exception {
		BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
		List<Element> conlist = rootEle.elements();		//获取子节点
		List<Person> list = new ArrayList<Person>();	//创建数组
		 for(Element e : conlist) {		//遍历XML文件了的数据并存入List数组中
			 Person p=new Person();
			 p.setId(e.attributeValue("id"));
			 p.setName(e.elementText("name"));
			 p.setDel(e.elementText("del"));
			 list.add(p);
		 }
		 System.out.print("请输入要查找联系人的姓名:");
			String name =  bufr.readLine();
			
		 for (Person person:list) {
			 if(person.getName().equals(name)) {
	            System.out.println(person.toString());	//输出时调用Person抽象类里的toString方法
			 }else {
				 System.out.println("抱歉!查无此人!!");
				 break;
			 }
		}
	}

}

5、创建main方法 (AddressListmain.java)

  通过main方法实现所有更能,在main方法了还写了一个简单的菜单界面。因为自己电脑问题 /n 和 /t 不能正常编译所以代码里出现了大量的空格和空的输出语句。

package contact;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import org.dom4j.*;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import contact.LinkAddressList;


public class AddressListmain {

	public static void main(String[] args) throws Exception {
		// TODO 自动生成的方法存根
		SAXReader reader = new SAXReader();		//创建解析器
		Document doc = reader.read(new File("./src/Contact.xml"));	//读取文档
		Element rootEle = doc.getRootElement();		//获取根节点
		LinkAddressList linkaddresslist=new LinkAddressList();	
		BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));  //读取控制台输入的文本
		
		while(true) {	 // 循环滚动菜单
			System.out.println();
			System.out.println(" ***************通讯录菜单*****************");
			System.out.println();
			System.out.println("	    《1》   添加联系人");
			System.out.println("	    《2》   删除联系人");
			System.out.println("	    《3》   修改联系人");
			System.out.println("	    《4》   查找联系人");
			System.out.println("	    《5》   查看所有联系人");
			System.out.println("	    《Q》   退出程序");
			System.out.println();
			System.out.println(" ****************************************");
			System.out.print("请输入你的选择:");
		
		String choice =bufr.readLine();		//存放读取到的文本
		switch (choice) {
			case "Q":
				System.out.println("您已退出程序!!!");
				System.exit(0);		//关闭程序
				break;
			case "1":
				linkaddresslist.addContact(rootEle);	//调用添加联系人方法
				break;
			case "2":
				linkaddresslist.deletContact(rootEle);	//调用删除联系人方法
				break;
			case "3":
				linkaddresslist.changeContact(rootEle);	//调用修改联系人方法
				break;
			case "4":
				linkaddresslist.findContact(rootEle);	//调用查找联系人方法
				break;
			case "5":
				linkaddresslist.checkContact(rootEle);	//调用查看所有联系人方法
				break;
		default:
			System.out.println("输入格式错误,请重新输入!!!");	//如果输入的值不在菜单栏,提示输入出错误
			break;
		}
		
		FileOutputStream fos = new FileOutputStream("./src/Contact.xml");
		OutputFormat format = OutputFormat.createPrettyPrint();		
		format.setEncoding("utf-8");	//在XML的第一行的声明中的encoding属性的值,要与XML文件的真实编码一致
 
		XMLWriter writer = new XMLWriter(fos, format);		//使用XMLWriter工具类写XML
		writer.write(doc);	//执行写动作
		writer.flush();
		writer.close();		//释放资源
		}
	}
}


  谢谢观阅!

  希望对有需要的同学提供到帮助。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值