发布于2020-11-19 20:35 阅读(583) 评论(0) 点赞(24) 收藏(1)
我们将在使用dom4j解析XML和反射的基础上,将XML文件内的数据准确,完整的输出
建立Employee类,属性包含上面表格的列。 并将上题中的表格对应的XML数据进行解析,通过反射机制在程序中创建代表3行数据的3个Employee对象
创建一个实体类Employee:
package test;
/**
* 创建一个员工类
*/
public class Employee {
private int id; //编号
private String name; //姓名
private int age;//年龄
private String job;//岗位
private int salay;//工资
private int subsidies;//奖金
public int getId() {
return id;
}
public void setId(int 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 getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public int getSalay() {
return salay;
}
public void setSalay(int salay) {
this.salay = salay;
}
public int getSubsidies() {
return subsidies;
}
public void setSubsidies(int subsidies) {
this.subsidies = subsidies;
}
@Override
public String toString() {
return "Employee{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", job='" + job + '\'' +
", salay=" + salay +
", subsidies=" + subsidies +
'}';
}
public Employee(int id, String name, int age, String job, int salay, int subsidies) {
this.id = id;
this.name = name;
this.age = age;
this.job = job;
this.salay = salay;
this.subsidies = subsidies;
}
public Employee() {
super();
// TODO Auto-generated constructor stub
}
}
创建一个XML文件
<?xml version="1.0" encoding="UTF-8" ?>
<employees>
<employee id="1001">
<name>张三</name>
<age>18</age>
<jobs>程序员</jobs>
<salay>30000</salay>
<subsidies>5000</subsidies>
</employee>
<employee id="1002">
<name>李四</name>
<age>19</age>
<jobs>讲师</jobs>
<salay>35000</salay>
<subsidies>2000</subsidies>
</employee>
<employee id="1003">
<name>王五</name>
<age>20</age>
<jobs>教授</jobs>
<salay>10000</salay>
<subsidies>2000</subsidies>
</employee>
</employees>
创建一个测试类:
package test;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Test {
public static void main(String[] args) throws Exception {
/**
* 我们先解析XML文件 (使用DOM4J方式进行)
* 1. 创建SAXReader对象
* 2. 调用read方式
* 3. 获取根元素
* 4. 通过迭代器遍历直接节点
*/
//创建容器,存储类
ArrayList<Employee> empList = new ArrayList<Employee>();
// 1. 创建SAXReader对象
SAXReader reader = new SAXReader();
//2. 调用read方法
Document doc = reader.read(new File("src/test/emp.xml"));
//3. 获取根节点
Element root = doc.getRootElement();
// 4. 通过迭代器遍历直接节点
for(Iterator<Element> iteEmployee = root.elementIterator(); iteEmployee.hasNext();){
//获取下一个子节点
Element employeeEle=iteEmployee.next();
//创建Employee类Class对象
Class c = Employee.class;
//获取构造方法创建Employee
Constructor constructor = c.getDeclaredConstructor(null);
Employee employee = (Employee) constructor.newInstance();
//根据子节点,去遍历子节点的属性
for(Iterator<Attribute> iteAtt = employeeEle.attributeIterator(); iteAtt.hasNext();){
//获取子节点属性
Attribute attribute=iteAtt.next();
System.out.println(attribute.getName()+"\t"+attribute.getText());
}
}
//通过迭代器遍历元素
for (Iterator<Employee>iteEmployee = root.elementIterator();iteEmployee.hasNext();){
/**
* 创建employee对象(通过反射机制)
*/
Class c = Class.forName("test.Employee");
//1. 得到无参构造方法的对象
Constructor<Employee> cons = c.getConstructor(null);
//2. 通过无参构造方法的对象,创建employee对象
Employee employee = cons.newInstance();
//得到每一个节点
Element employeeEle = (Element) iteEmployee.next();
//使用for循环继续遍历
for (Iterator<Element>subEmployeeEle=employeeEle.elementIterator(); subEmployeeEle.hasNext();){
//得到每一个元素
Element subEle = subEmployeeEle.next();
/**
* 再通过反射机制去封装employee对象
*/
//获取节点的名称
String nodeName = subEle.getName();
//使用switch进行判断
switch (nodeName) {
case "name":
employee.setName(subEle.getText());
break;
case "age":
employee.setAge(Integer.parseInt(subEle.getText()));
break;
case "jobs":
employee.setJob(subEle.getText());
break;
case "salay":
employee.setSalay(Integer.parseInt(subEle.getText()));
break;
case "subsidies":
employee.setSubsidies(Integer.parseInt(subEle.getText()));
break;
}
}
//添加到集合内
empList.add(employee);
}
//将集合遍历
System.out.println("-------遍历集合------");
for (Employee em:empList){
// System.out.println(em.getName()+"\t"+em.getAge()+"\t"+em.getJob()+"\t"+em.getSalay()+"\t"+em.getSubsidies());
System.out.println(em);
}
}
}
这个测试类运行结果:
我们需要将id也放入到集合容器内,所以,我们将上面测试类的代码进行改造
改造结果如下:
package test;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Test {
public static void main(String[] args) throws Exception {
/**
* 我们先解析XML文件 (使用DOM4J方式进行)
* 1. 创建SAXReader对象
* 2. 调用read方式
* 3. 获取根元素
* 4. 通过迭代器遍历直接节点
*/
//创建容器,存储类
ArrayList<Employee> empList = new ArrayList<Employee>();
// 1. 创建SAXReader对象
SAXReader reader = new SAXReader();
//2. 调用read方法
Document doc = reader.read(new File("src/test/emp.xml"));
//3. 获取根节点
Element root = doc.getRootElement();
// 4. 通过迭代器遍历直接节点
for(Iterator<Element> iteEmployee = root.elementIterator(); iteEmployee.hasNext();){
//获取下一个子节点
Element employeeEle=iteEmployee.next();
//创建Employee类Class对象
Class c = Employee.class;
//获取构造方法创建Employee
Constructor constructor = c.getDeclaredConstructor(null);
Employee employee = (Employee) constructor.newInstance();
//根据子节点,去遍历子节点的属性
for(Iterator<Attribute> iteAtt = employeeEle.attributeIterator(); iteAtt.hasNext();){
//获取子节点属性
Attribute attribute=iteAtt.next();
System.out.println(attribute.getName()+"\t"+attribute.getText());
//获取添加id属性的方法
Method method = c.getDeclaredMethod("setId", int.class);
method.invoke(employee, Integer.parseInt(attribute.getValue()));
}
/**
* 创建employee对象(通过反射机制)
*/
Class c2 = Class.forName("test.Employee");
//1. 得到无参构造方法的对象
Constructor<Employee> cons = c.getConstructor(null);
//2. 通过无参构造方法的对象,创建employee对象
Employee employee2 = cons.newInstance();
//使用for循环继续遍历
for (Iterator<Element>subEmployeeEle=employeeEle.elementIterator(); subEmployeeEle.hasNext();){
//得到每一个元素
Element subEle = subEmployeeEle.next();
/**
* 再通过反射机制去封装employee对象
*/
//获取节点的名称
String nodeName = subEle.getName();
//使用switch进行判断
switch (nodeName) {
case "name":
employee.setName(subEle.getText());
break;
case "age":
employee.setAge(Integer.parseInt(subEle.getText()));
break;
case "jobs":
employee.setJob(subEle.getText());
break;
case "salay":
employee.setSalay(Integer.parseInt(subEle.getText()));
break;
case "subsidies":
employee.setSubsidies(Integer.parseInt(subEle.getText()));
break;
}
}
//添加到集合内
empList.add(employee);
}
//将集合遍历
System.out.println("-------遍历集合------");
for (Employee em:empList){
// System.out.println(em.getId()+"\t"+em.getName()+"\t"+em.getAge()+"\t"+em.getJob()+"\t"+em.getSalay()+"\t"+em.getSubsidies());
System.out.println(em);
}
}
}
至此,我们将反射和dom4j使用XML结合起来,将XML内的数据正确输出
作者:java战神
链接:http://www.javaheidong.com/blog/article/978/a42b72f1d861b4a9c762/
来源:java黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 java黑洞网 All Rights Reserved 版权所有,并保留所有权利。京ICP备18063182号-2
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!