XML——DOM解析案例

7 篇文章 2 订阅
7 篇文章 9 订阅

【题目】:基于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操作。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值