java XML和反射的案例
我们要读取XML文件时需要用到解析工具,此处我们使用Dom4j。Dom4j用来读写XML文件;除此之外我们需要另外一个jar包——jaxen,我们可以通过jaxen使用XPath查询对应的节点。
案例
将数据存储到XML文件中。
过程
- 我们新建一个符合javaBeen规范的实体类 Student 类,我们的目的就是将以后 Student 对象数据存储到一个XML文件中,需要使用数据的时候,再从XML中读取对应的数据
public class Student {
private Integer id;
private String name;
private Integer age;
private String gender;
/*
* getter 和 setter 方法省略
* 无参和有参的构造方法省略
*/
}
- 导入 jar 包
以 eclipse 进行演示
在项目上----右键----选择build path ---- configure build path ----选择libraries ---- 选择add external jars ----之后选择下载的位置点击应用即可
这样就是导入成功。 - 开始处理
新建一个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文件