java XML 通过BeanUtils的population为对象赋值 根据用户选择进行dom4j解析

根据xml文件设计Student对象

<?xml version="1.0" encoding="UTF-8"?>
<students>
    <course name = "平面设计">
        <student id = "it001">
            <name>章子怡</name>
            <age>20</age>
            <sex>女</sex>
            <score>99</score>
        </student>
        <student id = "it002">
            <name>杨颖</name>
            <age>21</age>
            <sex>女</sex>
            <score>100</score>
        </student>
    </course>
    <course name = "JavaEE">
        <student id = "it003">
            <name>汪峰</name>
            <age>22</age>
            <sex>男</sex>
            <score>89</score>
        </student>
        <student id = "it004">
            <name>撒贝宁</name>
            <age>23</age>
            <sex>男</sex>
            <score>90</score>
        </student>
    </course>
</students>

设计学生类

package com.swift.kaoshi;

public class Student {

    private String id;
    private String name;
    private int age;
    private String sex;
    private int score;
    private String course;
    
    public Student() {
        super();
        // TODO Auto-generated constructor stub
    }
    
    public Student(String id, String name, int age, String sex, int score, String course) {
        super();
        this.id = id;
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.score = score;
        this.course = course;
    }
    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 getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }


    public int getScore() {
        return score;
    }

    public void setScore(int score) {
        this.score = score;
    }
    public String getCourse() {
        return course;
    }
    public void setCourse(String course) {
        this.course = course;
    }
    @Override
    public String toString() {
        return "Student [id=" + id + ", name=" + name + ", age=" + age + ", sex=" + sex + ", score=" + score
                + ", course=" + course + "]";
    }
    
}

根据菜单进行解析

package com.swift.kaoshi;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;

import org.apache.commons.beanutils.BeanUtils;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

/*

请按以下要求编写代码:
1.    按XML文档描述创建Student类(注意:包含id字段、科目字段);
2.    为用户列出菜单:
【查询学员】
1.按学科   2.按性别   3.按年龄   4.按分数    5.退出
3.    用户选择:
1.    按学科:检索出XML中所有的”学科”名称,并继续列出菜单:
         例如:1.平面设计   2.JavaEE
2.    按性别:列出性别选择二级菜单:
         例如:1.男      2.女
3.    按年龄:请用户输入年龄范围,格式:小值-大值。
         例如:20-25
4.    按分数:请用户输入分数范围,格式:小值-大值。
         例如:80-100
4.    根据用户输入,在XML文件中检索出相应的学员信息,并使用Student对象封装,多个Student对象封装到一个ArrayList中;
5.    遍历ArrayList,为用户显示查询结果;*/

public class ReflectStudent {

    public static void main(String[] args) throws Exception {

        inputQuery();
    }

    private static void inputQuery() throws Exception {

        System.out.println("[查询学员]");
        List<String> courseList=new ArrayList<String>();
        Scanner scan = new Scanner(System.in);
        a:while (true) {
            System.out.println();
            System.out.println("1.按学科   2.按性别   3.按年龄   4.按分数    5.退出");
            String key=scan.nextLine();
            switch (key) {
            case "1":
                System.out.println("继续按学科查询学员~~");
                
                SAXReader sax=new SAXReader();
                Document document = sax.read(new File("students.xml"));
                Element root =document.getRootElement();
                List<Element> courses = root.elements("course");
                for(Element course:courses) {
                    Attribute attribute=course.attribute("name");
                    String courseValue=attribute.getValue();
//                    System.out.println(courseValue);
                    courseList.add(courseValue);
                }
                System.out.println("1.按"+courseList.get(0)+"    2.按"+courseList.get(1));
                String key_Course=scan.nextLine();
                switch (key_Course) {
                case "1":
                    System.out.println("继续按平面设计查询学员~~");
                    for(Element course:courses) {
                        Attribute attribute=course.attribute("name");
                        String courseValue=attribute.getValue();
                        if(courseValue.equals("平面设计")) {
//                            System.out.println("ok");
                            List<Element> listStudent=course.elements("student");
                            for(Element stu:listStudent) {
                                String id=stu.attribute("id").getValue();
                                String name=stu.element("name").getText();
                                String age=stu.element("age").getText();
                                String sex=stu.element("sex").getText();
                                String score=stu.element("score").getText();
                                //反射得到对象,BeanUtils设置属性进对象
                                Class clazz=Class.forName("com.swift.kaoshi.Student");
                                Object obj=clazz.getConstructor().newInstance();
                                Map<String,String[]> stus=new HashMap<String,String[]>();
                                stus.put("id", new String[] {id});
                                stus.put("name", new String[] {name});
                                stus.put("age", new String[] {age});
                                stus.put("sex", new String[] {sex});
                                stus.put("score", new String[] {score});
                                stus.put("course", new String[] {courseValue});
//                                System.out.println(stus);
                                Set<String> set = stus.keySet();
                                for(String s:set) {
//                                    System.out.println(s);
//                                    System.out.println(Arrays.toString(stus.get(s)));
                                }
                                BeanUtils.populate(obj, stus);
                                System.out.println(obj);
                            }
                        }
                    }
                    break;
                case "2":
                    System.out.println("继续按JavaEE查询学员~~");
                    for(Element course:courses) {
                        Attribute attribute=course.attribute("name");
                        String courseValue=attribute.getValue();
                        if(courseValue.equals("JavaEE")) {
//                            System.out.println("ok");
                            List<Element> listStudent=course.elements("student");
                            for(Element stu:listStudent) {
                                String id=stu.attribute("id").getValue();
                                String name=stu.element("name").getText();
                                String age=stu.element("age").getText();
                                String sex=stu.element("sex").getText();
                                String score=stu.element("score").getText();
                                //反射得到对象,BeanUtils设置属性进对象
                                Class clazz=Class.forName("com.swift.kaoshi.Student");
                                Object obj=clazz.getConstructor().newInstance();
                                Map<String,String[]> stus=new HashMap<String,String[]>();
                                stus.put("id", new String[] {id});
                                stus.put("name", new String[] {name});
                                stus.put("age", new String[] {age});
                                stus.put("sex", new String[] {sex});
                                stus.put("score", new String[] {score});
                                stus.put("course", new String[] {courseValue});
//                                System.out.println(stus);
                                Set<String> set = stus.keySet();
                                for(String s:set) {
//                                    System.out.println(s);
//                                    System.out.println(Arrays.toString(stus.get(s)));
                                }
                                BeanUtils.populate(obj, stus);
                                System.out.println(obj);
                            }
                        }
                    }
                    break;
                    
                default:
                    System.out.println("抱歉,您输入的数字不符合要求,请重新输入.");
                    break;
                }
                
                break ;
            case "2":
                System.out.println("继续按性别查询学员~~");
                break ;
            case "3":
                System.out.println("继续按年龄查询学员~~");
                break ;
            case "4":
                System.out.println("继续按分数查询学员~~");
                break ;
            case "5":
                System.out.println("选择结束,退出.");
                break a;
            default:
                System.out.println("抱歉,您输入的数字不符合要求,请重新输入.");
                break;
            }
        }
    }
}

使用jar包

 重写上边的程序

package com.swift.kaoshi;

import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;

import org.apache.commons.beanutils.BeanUtils;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

/*

请按以下要求编写代码:
1.    按XML文档描述创建Student类(注意:包含id字段、科目字段);
2.    为用户列出菜单:
【查询学员】
1.按学科   2.按性别   3.按年龄   4.按分数    5.退出
3.    用户选择:
1.    按学科:检索出XML中所有的”学科”名称,并继续列出菜单:
         例如:1.平面设计   2.JavaEE
2.    按性别:列出性别选择二级菜单:
         例如:1.男      2.女
3.    按年龄:请用户输入年龄范围,格式:小值-大值。
         例如:20-25
4.    按分数:请用户输入分数范围,格式:小值-大值。
         例如:80-100
4.    根据用户输入,在XML文件中检索出相应的学员信息,并使用Student对象封装,多个Student对象封装到一个ArrayList中;
5.    遍历ArrayList,为用户显示查询结果;*/

public class ReflectStudent {

    public static void main(String[] args) throws Exception {

        inputQuery();
    }

    private static void inputQuery() throws Exception {

        System.out.println("[查询学员]");
        List<String> courseList = new ArrayList<String>();
        Scanner scan = new Scanner(System.in);
        SAXReader sax = new SAXReader();
        Document document = sax.read(new File("students.xml"));
        Element root = document.getRootElement();
        List<Element> courses = root.elements("course");
        for (Element course : courses) {
            Attribute attribute = course.attribute("name");
            String courseValue = attribute.getValue();
            // System.out.println(courseValue);
            courseList.add(courseValue);
        }
        a: while (true) {
            System.out.println();
            System.out.println("1.按学科   2.按性别   3.按年龄   4.按分数    5.退出");
            String key = scan.nextLine();
            switch (key) {
            case "1":
                System.out.println("继续按学科查询学员~~");
                System.out.println("1.按" + courseList.get(0) + "    2.按" + courseList.get(1));
                String key_Course = scan.nextLine();
                switch (key_Course) {
                case "1":
                    System.out.println("继续按平面设计查询学员~~");
                    for (Element course : courses) {
                        Attribute attribute = course.attribute("name");
                        String courseValue = attribute.getValue();
                        if (courseValue.equals("平面设计")) {
                            // System.out.println("ok");
                            List<Element> listStudent = course.elements("student");
                            beanToObj(course, listStudent);
                        }
                    }
                    break;
                case "2":
                    System.out.println("继续按JavaEE查询学员~~");
                    for (Element course : courses) {
                        Attribute attribute = course.attribute("name");
                        String courseValue = attribute.getValue();
                        if (courseValue.equals("JavaEE")) {
                            // System.out.println("ok");
                            List<Element> listStudent = course.elements("student");
                            beanToObj(course, listStudent);
                        }
                    }
                    break;
                default:
                    System.out.println("抱歉,您输入的数字不符合要求,请重新输入.");
                    break;
                }
                break;
            case "2":
                System.out.println("继续按性别查询学员~~");
                System.out.println("1.按男生    2.按女生");

                String key_Sex = scan.nextLine();
                switch (key_Sex) {
                case "1":
                    System.out.println("继续按男生查询学员~~");
                    for (Element course : courses) {
                        List<Element> studentsList = course.elements("student");
                        for (Element stu : studentsList) {
                            Element sex = stu.element("sex");
                            String sexText = sex.getText();
                            if (sexText.equals("男")) {
                                beanToOneObj(course, stu);
                            }
                        }
                    }
                    break;
                case "2":
                    System.out.println("继续按JavaEE查询学员~~");
                    for (Element course : courses) {
                        List<Element> studentsList = course.elements("student");
                        for (Element stu : studentsList) {
                            Element sex = stu.element("sex");
                            String sexText = sex.getText();
                            if (sexText.equals("女")) {
                                beanToOneObj(course, stu);
                            }
                        }
                    }
                    break;
                default:
                    System.out.println("抱歉,您输入的数字不符合要求,请重新输入.");
                    break;
                }
                break;
            case "3":
                System.out.println("继续按年龄查询学员~~");
                
                System.out.println("1.按年龄20-25岁    2.按年龄26-35");
                String key_age = scan.nextLine();
                switch (key_age) {
                case "1":
                    System.out.println("继续按年龄查询学员~~");
                    for (Element course : courses) {
                        List<Element> studentsList = course.elements("student");
                        for (Element stu : studentsList) {
                            Element age = stu.element("age");
                            String ageText = age.getText();
                            if (Integer.parseInt(ageText)>=20&&Integer.parseInt(ageText)<=25) {
                                beanToOneObj(course, stu);
                            }
                        }
                    }
                    break;
                case "2":
                    System.out.println("继续按年龄查询学员~~");
                    for (Element course : courses) {
                        List<Element> studentsList = course.elements("student");
                        for (Element stu : studentsList) {
                            Element age = stu.element("age");
                            String ageText = age.getText();
                            if (Integer.parseInt(ageText)>=26&&Integer.parseInt(ageText)<=35) {
                                beanToOneObj(course, stu);
                            }
                        }
                    }
                    break;
                default:
                    System.out.println("抱歉,您输入的数字不符合要求,请重新输入.");
                    break;
                }
                
                break;
            case "4":
                System.out.println("继续按分数查询学员~~");
                
                System.out.println("1.按分数60-80岁    2.按年龄80-100");
                String key_score = scan.nextLine();
                switch (key_score) {
                case "1":
                    System.out.println("继续按年龄查询学员~~");
                    for (Element course : courses) {
                        List<Element> studentsList = course.elements("student");
                        for (Element stu : studentsList) {
                            Element score = stu.element("score");
                            String scoreText = score.getText();
                            if (Integer.parseInt(scoreText)>=60&&Integer.parseInt(scoreText)<=80) {
                                beanToOneObj(course, stu);
                            }
                        }
                    }
                    break;
                case "2":
                    System.out.println("继续按年龄查询学员~~");
                    for (Element course : courses) {
                        List<Element> studentsList = course.elements("student");
                        for (Element stu : studentsList) {
                            Element score = stu.element("score");
                            String scoreText = score.getText();
                            if (Integer.parseInt(scoreText)>=81&&Integer.parseInt(scoreText)<=100) {
                                beanToOneObj(course, stu);
                            }
                        }
                    }
                    break;
                default:
                    System.out.println("抱歉,您输入的数字不符合要求,请重新输入.");
                    break;
                }
                
                break;
            case "5":
                System.out.println("选择结束,退出.");
                break a;
            default:
                System.out.println("抱歉,您输入的数字不符合要求,请重新输入.");
                break;
            }
        }
    }

    private static void beanToOneObj(Element course, Element stu) throws Exception {

        String id = stu.attribute("id").getValue();
        String name = stu.element("name").getText();
        String age = stu.element("age").getText();
        String sex = stu.element("sex").getText();
        String score = stu.element("score").getText();
        // 反射得到对象,BeanUtils设置属性进对象
        Class clazz = Class.forName("com.swift.kaoshi.Student");
        Object obj = clazz.getConstructor().newInstance();
        Map<String, String[]> stus = new HashMap<String, String[]>();
        stus.put("id", new String[] { id });
        stus.put("name", new String[] { name });
        stus.put("age", new String[] { age });
        stus.put("sex", new String[] { sex });
        stus.put("score", new String[] { score });
        stus.put("course", new String[] { course.attribute("name").getValue() });
        // System.out.println(stus);
        Set<String> set = stus.keySet();
        for (String s : set) {
            // System.out.println(s);
            // System.out.println(Arrays.toString(stus.get(s)));
        }
        BeanUtils.populate(obj, stus);
        System.out.println(obj);
    }

    private static void beanToObj(Element course, List<Element> listStudent) throws Exception {
        for (Element stu : listStudent) {
            beanToOneObj(course, stu);
        }
    }
}

 

posted @ 2018-03-12 21:32  Advancing-Swift  阅读(567)  评论(0编辑  收藏  举报