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文件
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值