package hf.firstclass.dom4j;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.List;
/**
* 编写一个通讯录程序
* 功能需求:
1)增加联系人
2)修改联系人
3)删除联系人
4)查询所有联系人(全部)
5)退出系统
要求:
1)交互使用控制台进行交互
2)联系人的数据存储到xml文件中(contact.xml) (dom4j的操作)
xml文件格式:
<contact id="001" hobby="eat">
<name>张三</name>
<gender>男</gender>
<age>22</age>
<phone>17728394033</phone>
<email>101440122@qq.com</email>
<address>130号</address>
</contact>
* @author LZK
*
*/
//运行的主程序
public class ContactSystem {
public static void main(String[] args) throws Exception {
//建立一个读取流,获取用户的输入
BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
//创建一个联系人操作对象
OperatContact oper=new OperatContact();
while(true){
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.print("请输入需求数字:");
String command=bufr.readLine();
//添加联系人,并封装到Contact对象中。
if("1".equals(command)){
Contact con = new Contact();
System.out.print("请输入联系人的姓名:");
String name=bufr.readLine();
con.setName(name);
System.out.print("请输入联系人的性别:");
String gender=bufr.readLine();
con.setGender(gender);
System.out.print("请输入联系人的年龄:");
String age=bufr.readLine();
con.setAge(age);
System.out.print("请输入联系人的电话:");
String phone=bufr.readLine();
con.setPhone(phone);
System.out.print("请输入联系人的email:");
String email=bufr.readLine();
con.setEmail(email);
System.out.print("请输入联系人的地址:");
String address=bufr.readLine();
con.setAddress(address);
//向XML文件中添加联系人
oper.addContact(con);
System.out.println("============添加成功!=============");
}
//修改联系人,并封装信息到对象
else if("2".equals(command)){
Contact con = new Contact();
System.out.print("请输入你想要修改的联系人的id:");
String id=bufr.readLine();
con.setId(id);
System.out.print("请修改联系人的姓名:");
String name=bufr.readLine();
con.setName(name);
System.out.print("请修改联系人的性别:");
String gender=bufr.readLine();
con.setGender(gender);
System.out.print("请修改联系人的年龄:");
String age=bufr.readLine();
con.setAge(age);
System.out.print("请修改联系人的电话:");
String phone=bufr.readLine();
con.setPhone(phone);
System.out.print("请修改联系人的email:");
String email=bufr.readLine();
con.setEmail(email);
System.out.print("请修改联系人的地址:");
String address=bufr.readLine();
con.setAddress(address);
//更新XML文件的联系人
oper.updateContact(con);
System.out.println("============修改成功!=============");
}
//删除联系人
else if("3".equals(command)){
System.out.print("请输入你要删除的联系人的id:");
String id=bufr.readLine();
oper.deleteContact(id);
System.out.println("============删除成功!=============");
}
//查询联系人
else if("4".equals(command)){
List<Contact> conlist=oper.findAll();
for(Contact con:conlist){
System.out.println(con);
}
}
//退出系统
else if("5".equals(command)){
System.exit(0);
}
}
}
}
//将增删改查功能封装在一个类中
package hf.firstclass.dom4j;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import org.dom4j.Document;
import org.dom4j.Element;
public class OperatContact {
/**
* 添加联系人 要求id要唯一
* @param con
*/
public void addContact(Contact con) {
//读取XML文件
File file=new File("./src/contact.xml");
Document doc=Dom4jUtil.getDocument(file);
//添加信息
Element rootEle=doc.getRootElement();
//根据根节点添加contact节点
Element conEle=rootEle.addElement("contact");
//编号使用UUID算法生成一个随机且唯一的字符串
conEle.addAttribute("id", UUID.randomUUID().toString());
conEle.addElement("name").addText(con.getName());
conEle.addElement("gender").addText(con.getGender());
conEle.addElement("age").addText(con.getAge());
conEle.addElement("phone").addText(con.getPhone());
conEle.addElement("email").addText(con.getEmail());
conEle.addElement("address").addText(con.getAddress());
//将xml文件写入到磁盘中
Dom4jUtil.writeXML(file, doc);
}
/**
* 修改联系人
* @param con
*/
public void updateContact(Contact con) {
//读取XML文件
File file=new File("./src/contact.xml");
Document doc=Dom4jUtil.getDocument(file);
String id=con.getId();
//XPath技术,快速找出联系人
Element conEle=(Element) doc.selectSingleNode("//contact[@id='"+id+"']");
conEle.element("name").setText(con.getName());
conEle.element("gender").setText(con.getGender());
conEle.element("age").setText(con.getAge());
conEle.element("phone").setText(con.getPhone());
conEle.element("email").setText(con.getEmail());
conEle.element("address").setText(con.getAddress());
//将xml文件写入到磁盘中
Dom4jUtil.writeXML(file, doc);
}
/**
* 根据id删除联系人
* @param id
*/
public void deleteContact(String id) {
//读取XML文件
File file=new File("./src/contact.xml");
Document doc=Dom4jUtil.getDocument(file);
//Xpath技术,快速找出联系人
Element conEle=(Element) doc.selectSingleNode("//contact[@id='"+id+"']");
doc.getRootElement().remove(conEle);
//将xml文件写入到磁盘中
Dom4jUtil.writeXML(file, doc);
}
/**
* 查询联系人
* @return XML文件所有联系人的集合
*/
public List<Contact> findAll() {
//定义一个集合用于装所有的联系人信息
List<Contact> conList=new ArrayList<Contact>();
//读取XML文件
File file=new File("./src/contact.xml");
Document doc=Dom4jUtil.getDocument(file);
//获得XML文件中联系人列表
List<Element> list=doc.getRootElement().elements("contact");
//遍历联系人列表
for(Element conEle:list){
Contact con=new Contact();
con.setId(conEle.attributeValue("id"));
con.setName(conEle.elementText("name"));
con.setGender(conEle.elementText("gender"));
con.setAge(conEle.elementText("age"));
con.setPhone(conEle.elementText("phone"));
con.setEmail(conEle.elementText("email"));
con.setAddress(conEle.elementText("address"));
//每封装一个联系人信息,就添加到集合中
conList.add(con);
}
return conList;
}
}
//将重复用到的程序抽取出来,单独建工具类
public class Dom4jUtil {
/**
* 读取XML文件
* @param f 要读取的XML文件
* @return Document 文件
*/
public static Document getDocument(File f){
try {
Document doc=new SAXReader().read(f);
return doc;
} catch (DocumentException e) {
//由于函数有返回值,需要进行处理,将其转换为运行时异常
throw new RuntimeException();
}
}
/**
* 将修改好的文件写入到源文件中
* @param f 要写入的文件
* @param doc 写入的文档
*/
public static void writeXML(File f,Document doc){
try {
OutputStream ops=new FileOutputStream(f);
OutputFormat format=OutputFormat.createPrettyPrint();
format.setEncoding("utf-8");
XMLWriter writer = new XMLWriter(ops,format);
writer.write(doc);
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 定义一个联系人的类
* 用于存储联系人全部信息,id 姓名 性别 年龄 电话 邮件 地址
* @author Administrator
*
*/
package hf.firstclass.dom4j;
public class Contact {
private String id;
private String name;
private String gender;
private String age;
private String phone;
private String email;
private String address;
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 String getAge() {
return age;
}
public void setAge(String 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 getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Contact [id=" + id + ", name=" + name + ", gender=" + gender + ", age=" + age + ", phone=" + phone
+ ", email=" + email + ", address=" + address + "]";
}