最近在学习java,写了一个java操作xml实现公司员工管理的简单程序,注释很详细,希望能帮助初学者理解。
/**
* 用W3C提供的Java操作XML方法重做ManageEmployee
*/
import java.io.DataInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class ManageEmployeeWithXML {
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, TransformerException {
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();//载入xml解析器
DocumentBuilder db=factory.newDocumentBuilder();//创建一个xml对象
Element theEmployee=null, theElem=null, root=null;
Document xmldoc=db.parse("f://employee.xml");//从xml对象获取dom实例
root=xmldoc.getDocumentElement();//获得根
/*输出命令菜单*/
System.out.println("===COMMAND LIST===/nadd: 添加一个员工/ndelete: 删除一个员工记录/nupdate: 修改员工信息/nshow: 打印员工信息/nhelp: 显示命令菜单/nexit:退出/n");
while(true){
String cmd;
cmd =readDataFromKeybord("Please input command:");
if(cmd.equalsIgnoreCase("add")){
System.out.println("Add Employee:");
//从键盘获取新建的员工信息
String name=readDataFromKeybord("Name:");
String salary=readDataFromKeybord("Salary:");
String hireDay=readDataFromKeybord("hireDay:");
//--- 新建一个员工开始 ----
//创建名字项
theEmployee=xmldoc.createElement("Employee");
theElem=xmldoc.createElement("name");
theElem.setTextContent(name);
theEmployee.appendChild(theElem);//给Employee加入Element
//创建薪水项
theElem=xmldoc.createElement("salary");
theElem.setTextContent(salary);
theEmployee.appendChild(theElem);
//创建雇期项
theElem=xmldoc.createElement("hireday");
theElem.setTextContent(hireDay);
theEmployee.appendChild(theElem);
root.appendChild(theEmployee);//给根添加employee
System.out.println("--- 新建成功! ----");
//--- 新建一个员工完成 ----
continue;
}
if(cmd.equalsIgnoreCase("show")){
NodeList nlEmployee=root.getElementsByTagName("Employee");//获取所有Employee结点
System.out.println("---输出员工信息---");
for(int i=0;i<nlEmployee.getLength();i++){ //依次访问之
theEmployee=(Element) (nlEmployee.item(i));
//依次访问子节点,获取内容并输出之
printInformation(theEmployee,i);
}
continue;
}
if(cmd.equalsIgnoreCase("update")){
int i=Integer.parseInt(readDataFromKeybord("Input the number of the employee to delete:"));
//查询到所有Employee结点
NodeList nlEmployee=root.getElementsByTagName("Employee");
//根据用户需求定位
theEmployee=(Element) nlEmployee.item(i-1);
System.out.println("--- 查找No."+i+"员工信息 ----");
while(true){
printInformation(theEmployee,i-1);
String item=readDataFromKeybord("Input the item to update: < name/ salary/ hireday >");
if(item.equalsIgnoreCase("name")){
theEmployee.getElementsByTagName("name").item(0).setTextContent(readDataFromKeybord("修改这位员工的名字为:"));
System.out.println("--- 修改成功 ----");
}
else if(item.equalsIgnoreCase("hireDay")){
theEmployee.getElementsByTagName("hireday").item(0).setTextContent(readDataFromKeybord("修改这位员工的雇期为:"));
System.out.println("--- 修改成功 !----");
}
else if(item.equalsIgnoreCase("salary")){
theEmployee.getElementsByTagName("salary").item(0).setTextContent(readDataFromKeybord("修改这位员工的薪金为:"));
System.out.println("--- 修改成功 ----");
}
else System.out.println("没有找到修改项!");
if(readDataFromKeybord("继续?<Y/N>").equalsIgnoreCase("n")) break;
}
continue;
}
if(cmd.equalsIgnoreCase("delete")){
int i=Integer.parseInt(readDataFromKeybord("Input the number of the employee to delete:"));
//查询到所有Employee结点
NodeList nlEmployee=root.getElementsByTagName("Employee");
//根据用户需求定位
if(i<=0||i>=nlEmployee.getLength()){
System.out.println("Employee Not Foud!");
break;
}
theEmployee=(Element) nlEmployee.item(i-1);
System.out.print("---将要删除No."+i+"的信息:");
printInformation(theEmployee,i-1);
theEmployee.getParentNode().removeChild(theEmployee);//移除该结点
System.out.println("--- 删除成功 ----");
continue;
}
if(cmd.equalsIgnoreCase("help")){
System.out.println("===COMMAND LIST===/nadd: 添加一个员工/ndelete: 删除一个员工记录/nupdate: 修改员工信息/nshow: 打印员工信息/nhelp: 显示命令菜单/nexit:退出/n");
continue;
}
if(cmd.equals("exit")){
Transformer trans=TransformerFactory.newInstance().newTransformer();
trans.transform(new DOMSource(xmldoc), new StreamResult(new FileOutputStream("f://employee_modified.xml")));
System.out.println("信息已保存,退出程序!");
break;
}
System.out.println("Error Command!");
continue;
}
}
/*
* 输出提示字符,并返回从键盘读入的信息
*/
private static String readDataFromKeybord(String prompt) throws IOException {
System.out.print(prompt);
String cmd=(new DataInputStream(System.in)).readLine();
return cmd;
}
/*
* 用于输出一个Employee节点下的所有信息,参数i为第i位员工
*/
private static void printInformation(Element theEmployee,int i ) {
Element theElem;
theElem=(Element)(theEmployee.getElementsByTagName("name").item(0));
System.out.print("No."+(i+1)+" 姓名:"+theElem.getTextContent());
theElem=(Element)(theEmployee.getElementsByTagName("salary").item(0));
System.out.print(" 薪水:"+theElem.getTextContent());
theElem=(Element)(theEmployee.getElementsByTagName("hireday").item(0));
System.out.println(" 雇期:"+theElem.getTextContent());
}
}