问题描述:对于电话簿,它应该有添加、更新、删除、展示联系人信息的功能
实现该功能运用的主要知识包括文件操作、xml文件解析(dom解析)
<?xml version="1.0" encoding="UTF-8"?>
<!--文档声明-->
<!--描述联系人(可以有多个联系人)
属性:编号 姓名 性别 电话 邮箱 地址
有且仅有一个根标签-->
<contact-list>
<contact id="002">
<name>优秀超</name>
<gender>女</gender>
<phone>18312349876</phone>
<email>282212344321@qq.com</email>
<address>中南海</address>
</contact>
</contact-list>
上面代码时.xml文件内容
问题分析:1)添加操作:我们首先要新建一个contact标签,并且对其id属性(具有唯一性)进行赋值,接下来创建它的子标签(如:name标签...),在对id属性进行赋值时,首先要
判断原电话簿中是否有该id存在,不存在就添加,存在重新输入
2)更新操作:首先要判断电话簿中是否有联系人,没有就提示添加,;根据输入的编号(判断输入编号是否存在)找到对应的联系人,然后对其进行修改,如果修改编号,都要检验输入id编号是否已经存在
在电话簿中
3)删除操作:首先要判断电话簿中是否有联系人,没有就提示添加,根据输入的编号(判断输入编号是否存在)找到对应的联系人,直接利用detach()方法删除对应联系人
4)展示联系人的信息操作:获取所有contact标签,对其进行输出
下面是每一步的详细代码:
先给出辅助代码:
//判断文档是否存有联系人
//判断文档是否存有联系人
public static boolean isNull(Document doc){
List<Element> list = doc.getRootElement().elements("contact");
if(list.size() == 0){
return true;
}
return false;
}
//打印对应编号的信息
//打印对应编号的信息
public static void printContact(Element conEle){
//打印当前编号机主的信息,
List<Element> list = conEle.elements();
//获取id属性值
Attribute idAttr = conEle.attribute("id");
System.out.println(idAttr.getName()+":"+idAttr.getValue());
for(Element e : list)
System.out.println(e.getName()+":"+e.getText());
System.out.println("------------");
}
//输出到E:/contact.xml
//输出到E:/contact.xml
public static void out(Document doc) throws Exception {
//输出
OutputStream out = new FileOutputStream("E:"+File.separator+"contact.xml") ;
//输出格式:
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = new XMLWriter(out,format) ;
writer.write(doc);
writer.close();
}
//根据所传参数进行修改信息
//根据所传参数进行修改信息
public static void up(Element conEle,String name){
//通过属性名称获取属性
if("id".equals(name)) {
Attribute Attr = conEle.attribute(name);
Attr.setValue(sc.next());
}else{
Element elem = conEle.element(name);
elem.setText(sc.next());
}
}
//判断编号是否存在
//判断编号是否存在
public static Element isIDExit(String s, List<Element> list){
for(Element e : list){
if(e.attributeValue("id").equals(s))
return e;
}
return null;
}
//判断编号是否重复
//判断编号是否重复
public static boolean isIdRepeat(String s, List<Element> list){
for(Element e : list){
if(e.attributeValue("id").equals(s))
return false;
}
return true;
}
添加操作代码:
private static void add() throws Exception {
Document doc = new SAXReader().read(new File("E:"+File.separator+"contact.xml"));
//获取根标签的子标签集合
List<Element> list = doc.getRootElement().elements();
Element conElem = null;
//添加属性
boolean flag = true;
System.out.println("请输入编号:");
while(flag){
String str = sc.next();
if(isIdRepeat(str,doc.getRootElement().elements("contact"))){
//创建contact标签
conElem = DocumentHelper.createElement("contact");
//将该标签插入第一位
list.add(0,conElem);
//输入对应id
conElem.addAttribute("id",str) ;
flag = false;
}else{
System.out.println("输入编号重复,请重新输入:");
}
}
List<Element> list1 = conElem.elements();
//在contact标签下继续新建其他属性标签
System.out.println("请输入名字:");
Element name = DocumentHelper.createElement("name");
name.setText(sc.next());
list1.add(name);
System.out.println("请输入性别:");
Element gender = DocumentHelper.createElement("gender");
gender.setText(sc.next());
list1.add(gender);
System.out.println("请输入电话:");
Element phone = DocumentHelper.createElement("phone");
phone.setText(sc.next());
list1.add(phone);
System.out.println("请输入邮箱:");
Element email = DocumentHelper.createElement("email");
email.setText(sc.next());
list1.add(email);
System.out.println("请输入地址:");
Element address = DocumentHelper.createElement("address");
address.setText(sc.next());
list1.add(address);
//进行输出
out(doc);
System.out.println("添加成功");
System.out.println("============");
}
更新操作:
public static void update() throws Exception {
Document doc = new SAXReader().read(new File("E:"+File.separator+"contact.xml"));
if(isNull(doc)){
System.out.println("电话簿为空,请添加联系人");
System.out.println("============");
return;
}
System.out.println("请输入要更新机主的编号");
boolean flag = true;
//对应编号的标签
Element conEle = null;
while(flag){
String str = sc.next();
conEle = isIDExit(str,doc.getRootElement().elements("contact"));
if(conEle!=null){
//打印当前编号机主的信息,
flag = false;
}else{
System.out.println("输入编号不存在,请重新输入:");
}
}
//打印当前编号机主的信息,
printContact(conEle);
System.out.println("1.修改编号\n" +"2.修改名字\n" + "3.修改性别\n" + "4.修改电话\n"+"5.修改邮箱\n"+"6.修改地址");
flag = true;
while (flag){
System.out.println("按照提示请自行修改");
while(flag) {
int n = sc.nextInt();
switch (n) {
case 1:
System.out.println("请输入新的编号:");
while (flag) {
String str = sc.nextLine();
if (isIdRepeat(str, doc.getRootElement().elements("contact"))) {
up(conEle, "id");
flag = false;
} else {
System.out.println("输入编号重复,请重新输入:");
}
}
break;
case 2:
System.out.println("请输入新的名字:");
up(conEle, "name");
flag = false;
break;
case 3:
System.out.println("请输入新的性别:");
up(conEle, "gender");
flag = false;
break;
case 4:
System.out.println("请输入新的电话:");
up(conEle, "phone");
flag = false;
break;
case 5:
System.out.println("请输入新的邮箱:");
up(conEle, "email");
flag = false;
break;
case 6:
System.out.println("请输入新的地址:");
up(conEle, "address");
flag = false;
break;
default:
System.out.println("-------------------------");
System.out.println("1.修改编号\n" +"2.修改名字\n" + "3.修改性别\n" + "4.修改电话\n"+"5.修改邮箱\n"+"6.修改地址");
System.out.println("请按提示输入正确选项:");
}
}
flag = true;
while(flag){
System.out.println("继续修改请输入Y/y,否则输入N/n");
String str = sc.next();
if(str.compareToIgnoreCase("Y") == 0){
break;
}else if(str.compareToIgnoreCase("N") == 0){
System.out.println("修改完成");
flag = false;
}else{
System.out.println("输入不正确,请重新输入");
}
}
}
//文件输出
out(doc);
System.out.println("============");
}
删除操作:
private static void del() throws Exception {
Document doc = new SAXReader().read(new File("E:"+File.separator+"contact.xml"));
if(isNull(doc)){
System.out.println("电话簿为空,请添加联系人");
System.out.println("============");
return;
}
boolean flag = true;
//获取对应编号的标签
Element conEle = null;
System.out.println("请输入删除编号:");
while(flag){
String str = sc.next();
//返回对应编号标签
conEle = isIDExit(str,doc.getRootElement().elements("contact"));
if(conEle!=null){
flag = false;
}else{
System.out.println("输入编号不存在,请重新输入:");
}
}
printContact(conEle);
flag = true;
while(flag){
System.out.println("删除请输入Y/y,否则输入N/n");
String str = sc.next();
if(str.compareToIgnoreCase("Y") == 0){
conEle.detach();
out(doc);
System.out.println("已删除");
System.out.println("============");
return;
}else if(str.compareToIgnoreCase("N") == 0){
flag = false;
}else{
System.out.println("输入不正确,请重新输入");
}
}
}
显示联系人操作:
public static void printMessage() throws Exception {
Document doc = new SAXReader().read(new File("E:"+File.separator+"contact.xml"));
if(isNull(doc)){
System.out.println("电话簿为空,请添加联系人");
System.out.println("============");
return;
}
List<Element> list = doc.getRootElement().elements("contact");
for(Element e : list){
printContact(e);
}
}
主方法为:
public static void main(String[] args) throws Exception {
while(true){
System.out.println("1.添加\n" +"2.修改\n" + "3.删除\n" + "4.打印全部信息");
int n = sc.nextInt();
System.out.println("==========");
switch(n){
case 1: add();
break;
case 2: update();
break;
case 3: del();
break;
case 4: printMessage();
break;
default:
System.out.println("请重新输入:");
}
}
}
类中定影静态成员属性static Scanner sc = new Scanner(System.in);