Java XML和反射的案例

java XML和反射的案例

我们要读取XML文件时需要用到解析工具,此处我们使用Dom4j。Dom4j用来读写XML文件;除此之外我们需要另外一个jar包——jaxen,我们可以通过jaxen使用XPath查询对应的节点。

案例

将数据存储到XML文件中。

过程

  1. 我们新建一个符合javaBeen规范的实体类 Student 类,我们的目的就是将以后 Student 对象数据存储到一个XML文件中,需要使用数据的时候,再从XML中读取对应的数据
public class Student {
	private Integer id;
	private String name;
    	private Integer age;
   	private String gender;
   	/*
   	*  getter 和 setter 方法省略
   	*  无参和有参的构造方法省略
   	*/
}
  1. 导入 jar 包
    以 eclipse 进行演示
    在项目上----右键----选择build path ---- configure build path ----选择libraries ---- 选择add external jars ----之后选择下载的位置点击应用即可
    在这里插入图片描述
    这样就是导入成功。
  2. 开始处理
    新建一个MainProject.java文件,开始进行处理
    我们将读取和写入分开处理。

写入操作

public static void saveDateToXML(ArrayList<Student> list) throws IllegalAccessException, IOException {
	// 创建XML文件对应Document对象
	Document document = DocumentHelper.createDocument();

	// 明确根节点
        Element root = document.addElement("students");

	// 获取所有的成员变量Field对象
        Field[] declaredFields = Student.class.getDeclaredFields();

	// 循环遍历Student ArrayList集合
        for (Student student : list) {
        	// 每一个Student对象都要对应一个Student节点
            	Element element = root.addElement("student");
            	
            	 // 遍历所有的Field成员变量
            	for (Field declaredField : declaredFields) {
            		//给予暴力反射权限
            		declaredField.setAccessible(true);
            		// id存储到Student节点中的属性中
               		if ("id".equals(declaredField.getName())) {
               			 // 所有的数据都是在String类型处理
                  		  element.addAttribute("id", declaredField.get(student) + "");
                  	} else {
                  		// declaredField.getName() 成员变量名字 declaredField.get(student) 对应数据
                    		element.addElement(declaredField.getName()).addText(declaredField.get(student) + "");
            		}
            	}
        }
        // 字符流对象+Document对象的write方法写入XML信息到文件中
        //xml文件路径 项目下 xml 文件中的 student.xml 文件
        FileWriter fileWriter = new FileWriter("./xml/student.xml");
        document.write(fileWriter);
        fileWriter.close();
}

文件读取操作

public static void readDataFromXML(ArrayList<Student> list) throws DocumentException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
	Document document = new SAXReader().read(new File("./xml/student.xml"));
	
	// 找出当前XML文件中的所有student节点
        List list1 = document.selectNodes("//student");
        
        // 得到当前Student类内的所有成员变量对象,注意使用暴力反射
        Field[] declaredFields = Student.class.getDeclaredFields();
	
	// 遍历所有的Student节点
        for (Object o : list1) {
            // Student节点对象
            Element element = (Element) o;
            Student student = new Student();
            
            // 成员变量Field数组遍历
            for (Field declaredField : declaredFields) {
            	// 给予暴力反射操作成员变量权限
                declaredField.setAccessible(true);
		
		// 获取当前成员变量的数据类型
                Class<?> type = declaredField.getType();

		// 如果数据类型是String类型
                if (type.equals(String.class)) {
			declaredField.set(student, element.element(declaredField.getName()).getText());
		} else if (type.equals(Integer.class)) {
			 Method valueOf = type.getMethod("valueOf", String.class);
			 if ("id".equals(declaredField.getName())) {
			 	declaredField.set(student, valueOf.invoke(student, element.attributeValue("id")));
		 	 } else {
		 	 	declaredField.set(student,valueOf.invoke(student, element.element(declaredField.getName()).getText()));
	 	 	 }
 	 	}
	}
	list.add(student);
}

main方法中
在这里插入图片描述
student.xml文件
在这里插入图片描述

发布了17 篇原创文章 · 获赞 21 · 访问量 6257

猜你喜欢

转载自blog.csdn.net/weixin_43932553/article/details/104720841