【题目】:基于XML文件实现一个简易的控制台程序,可以查看学生成绩,添加学生,删除学生等。
xml文件保存在src/com/dom/exercise文件夹下,它的格式如下:
<?xml version="1.0" encoding="utf-8" standalone="no"?><students>
<student sid="001">
<name>小明</name>
<course>
<java>90</java>
<oracle>90</oracle>
<vb>93</vb>
</course>
</student>
<student sid="002">
<name>小李</name>
<course>
<java>78</java>
<oracle>86</oracle>
<vb>98</vb>
</course>
</student>
<student sid="003">
<name>小王</name>
<course>
<java>89</java>
<oracle>83</oracle>
<vb>95</vb>
</course>
</student>
</students>
这个可以说是最简单的程序了,稍微复杂的一点是它要基于XML文件来实现,所以这里肯定要使用DOM解析,SAX不能用是因为SAX解析只能读取XML文件而不能更新。
1.首先编写StudentBean,如下:
package com.dom.exercise;
public class Student {
private String id = null;
private String name = null;
private int score_java;
private int score_oracle;
private int score_vb;
public Student() {
}
public Student(String id, String name, int score_java, int score_oracle,
int score_vb) {
super();
this.id = id;
this.name = name;
this.score_java = score_java;
this.score_oracle = score_oracle;
this.score_vb = score_vb;
}
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 int getScore_java() {
return score_java;
}
public void setScore_java(int score_java) {
this.score_java = score_java;
}
public int getScore_oracle() {
return score_oracle;
}
public void setScore_oracle(int score_oracle) {
this.score_oracle = score_oracle;
}
public int getScore_vb() {
return score_vb;
}
public void setScore_vb(int score_vb) {
this.score_vb = score_vb;
}
}
2.编写最关键的StudentService类,它对XML文档进行各种操作
import java.util.ArrayList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
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.Node;
import org.w3c.dom.NodeList;
public class StudentService {
private static Document document = null;
private static String path = "src/com/dom/exercise/student.xml";
static{
try{
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
document = documentBuilder.parse(path);
}catch(Exception e){
System.out.println("初始化失败...");
e.printStackTrace();
}
}
/**
* 获取所有学生信息
* @return
*/
public static ArrayList<Student> readAll(){
ArrayList<Student> array = new ArrayList<Student>();
NodeList students = document.getElementsByTagName("student");
for (int i = 0; i < students.getLength(); i++) {
Element node_student = (Element)students.item(i);
String id = node_student.getAttribute("sid");
Node node_name = node_student.getElementsByTagName("name").item(0);
String name = node_name.getTextContent();
Element node_course = (Element)node_student.getElementsByTagName("course").item(0);
Node course_java = node_course.getElementsByTagName("java").item(0);
Node course_oracle = node_course.getElementsByTagName("oracle").item(0);
Node course_vb = node_course.getElementsByTagName("vb").item(0);
int score_java = Integer.parseInt(course_java.getTextContent());
int score_oracle = Integer.parseInt(course_oracle.getTextContent());
int score_vb = Integer.parseInt(course_vb.getTextContent());
Student student = new Student(id, name, score_java, score_oracle, score_vb);
array.add(student);
}
return array;
}
/**
* 根据ID获取一个学生的信息
* @param sid
* @return
*/
public static Student getStudentById(String sid){
NodeList students = document.getElementsByTagName("student");
for (int i = 0; i < students.getLength(); i++) {
Element node_student = (Element)students.item(i);
String id = node_student.getAttribute("sid");
if(!id.equals(sid)){
continue;
}
Node node_name = node_student.getElementsByTagName("name").item(0);
String name = node_name.getTextContent();
Element node_course = (Element)node_student.getElementsByTagName("course").item(0);
Node course_java = node_course.getElementsByTagName("java").item(0);
Node course_oracle = node_course.getElementsByTagName("oracle").item(0);
Node course_vb = node_course.getElementsByTagName("vb").item(0);
int score_java = Integer.parseInt(course_java.getTextContent());
int score_oracle = Integer.parseInt(course_oracle.getTextContent());
int score_vb = Integer.parseInt(course_vb.getTextContent());
Student student = new Student(id, name, score_java, score_oracle, score_vb);
return student;
}
return null;
}
/**
* 添加学生
* @param student
*/
public static void addStudent(Student student){
Element stu = document.createElement("student");
stu.setAttribute("sid", student.getId());
Element name = document.createElement("name");
name.setTextContent(student.getName());
Element course = document.createElement("course");
Element score_java = document.createElement("java");
Element score_oracle = document.createElement("oracle");
Element score_vb = document.createElement("vb");
score_java.setTextContent(String.valueOf(student.getScore_java()));
score_oracle.setTextContent(String.valueOf(student.getScore_oracle()));
score_vb.setTextContent(String.valueOf(student.getScore_vb()));
course.appendChild(score_java);
course.appendChild(score_oracle);
course.appendChild(score_vb);
stu.appendChild(name);
stu.appendChild(course);
document.getDocumentElement().appendChild(stu);
update(document, path);
}
/**
* 根据ID删除一个学生
* @param sid
*/
public static void deleteStudentById(String sid){
NodeList students = document.getElementsByTagName("student");
for (int i = 0; i < students.getLength(); i++) {
Element student = (Element)students.item(i);
if(student.getAttribute("sid").equals(sid)){
student.getParentNode().removeChild(student);
}
}
update(document,path);
}
/**
* 更新到文件
* @param document
* @param path
*/
public static void update(Document document,String path){
try{
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult(new File(path)));
}catch(Exception e){
e.printStackTrace();
}
}
}
3.编写主测试程序
实现简易界面:
package com.dom.exercise;
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
boolean flag = true;
while(flag){
// 显示操作界面
System.console();
System.out.println("*********************操作界面*********************");
System.out.println("\t\t1.查询所有学生的成绩");
System.out.println("\t\t2.按照ID查询学生成绩 ");
System.out.println("\t\t3.添加一个学生");
System.out.println("\t\t4.按照ID删除一个学生");
System.out.println("\t\t0.退出系统");
System.out.println("************************************************");
// 获取用户的操作
String operate = scanner.next();
if ("1".equals(operate)) {
ArrayList<Student> students = StudentService.readAll();
System.out.println("所有的学生信息如下:");
System.out.println("Name\tID\tJava\tOracle\tVB");
for (Student student : students) {
System.out.println(student.getName() + "\t" + student.getId()
+ "\t" + student.getScore_java() + "\t"
+ student.getScore_oracle() + "\t"
+ student.getScore_vb());
}
}else if("2".equals(operate)){
System.out.println("请输入要查询的学生ID:");
String sid = scanner.next();
Student student = StudentService.getStudentById(sid);
System.out.println("学号为"+sid+"的学生的信息如下:");
System.out.println("Name\tID\tJava\tOracle\tVB");
System.out.println(student.getName() + "\t" + student.getId()
+ "\t" + student.getScore_java() + "\t"
+ student.getScore_oracle() + "\t"
+ student.getScore_vb());
}else if("3".equals(operate)){
System.out.println("请输入要添加的学生ID:");
String sid = scanner.next();
System.out.println("请输入要添加的学生姓名:");
String name = scanner.next();
System.out.println("请输入要添加的学生Java成绩:");
int score_java = Integer.parseInt(scanner.next());
System.out.println("请输入要添加的学生Oracle成绩:");
int score_oracle = Integer.parseInt(scanner.next());
System.out.println("请输入要添加的学生VB成绩:");
int score_vb = Integer.parseInt(scanner.next());
Student student = new Student(sid, name, score_java, score_oracle, score_vb);
StudentService.addStudent(student);
System.out.println("添加成功!");
}else if("4".equals(operate)){
System.out.println("请输入要删除的学生的ID:");
String sid = scanner.next();
StudentService.deleteStudentById(sid);
System.out.println("删除成功!");
}
System.out.println("是否继续?(Y/N)");
flag = scanner.next().trim().toLowerCase().equals("y")?true:false;
}
scanner.close();
}
}
4.运行结果
问题的关键仍是DOM解析XML,对XML进行crud操作。