您现在的位置是:首页 > 电脑技术查询 > web开发

利用dom4j包跟反射动态解析不同实体类型的xml文件

编辑:chaxungu时间:2022-10-10 23:24:12分类:web开发

利用dom4j包和反射动态解析不同实体类型的xml文件

自己写了个根据传入的实体类能够动态的解析相应的Xml文件的工具类

xml文件结构如下 

TeacherTable:<TeacherTable> <Table1>    <DepartmentID>30</DepartmentID>    <BMH>214</BMH>    <DepartmentName>外国语学院</DepartmentName>    <TeacherNO>P284</TeacherNO>    <TeacherName>张三丰</TeacherName>    <IdentityNO>42050288885198888</IdentityNO>    <Degree>无</Degree>    <Rank />    <Resume />    <Email />  </Table1></TeacherTable>StudentTable<StudentTable>  <Table1>    <DepartmentID>59</DepartmentID>    <DepartmentName>物理学院</DepartmentName>    <StuID>999999</StuID>    <ClassNO>20109999</ClassNO>    <StuNO>2010999999</StuNO>    <StuName>李小四</StuName>    <Grade>2010</Grade>    <Sex>男</Sex>    <Birthday>19900101</Birthday>    <PoliticalState>共青团员</PoliticalState>    <SpecialName>物理</SpecialName>    <SpecialID>279</SpecialID>    <Nation>汉族</Nation>    <IdentityNO>42099199109279999</IdentityNO>    <EduYear>4</EduYear>    <EduLever>本科</EduLever>  </Table1></StudentTable>

 

相应的实体类

package net.model;/** * 老师信息格式 */public class TeacherTable {private String DepartmentID;private String BMH;private String DepartmentName;private String TeacherNO;private String TeacherName;private String IdentityNO;private String Degree;private String Rank;private String Resume;private String Email;public String getDepartmentID() {return DepartmentID;}public void setDepartmentID(String departmentID) {DepartmentID = departmentID;}public String getBMH() {return BMH;}public void setBMH(String bMH) {BMH = bMH;}public String getDepartmentName() {return DepartmentName;}public void setDepartmentName(String departmentName) {DepartmentName = departmentName;}public String getTeacherNO() {return TeacherNO;}public void setTeacherNO(String teacherNO) {TeacherNO = teacherNO;}public String getTeacherName() {return TeacherName;}public void setTeacherName(String teacherName) {TeacherName = teacherName;}public String getIdentityNO() {return IdentityNO;}public void setIdentityNO(String identityNO) {IdentityNO = identityNO;}public String getDegree() {return Degree;}public void setDegree(String degree) {Degree = degree;}public String getRank() {return Rank;}public void setRank(String rank) {Rank = rank;}public String getResume() {return Resume;}public void setResume(String resume) {Resume = resume;}public String getEmail() {return Email;}public void setEmail(String email) {Email = email;}}

 

package net.model;/** * 学生信息格式 */public class StudentTable { private String DepartmentID; private String DepartmentName; private String StuID; private String ClassNO; private String StuNO; private String StuName; private String Grade; private String Sex; private String Birthday; private String PoliticalState; private String SpecialName; private String SpecialID; private String Nation; private String IdentityNO; private String EduYear; private String EduLever; public String getDepartmentID() {return DepartmentID;}public void setDepartmentID(String departmentID) {DepartmentID = departmentID;}public String getDepartmentName() {return DepartmentName;}public void setDepartmentName(String departmentName) {DepartmentName = departmentName;}public String getStuID() {return StuID;}public void setStuID(String stuID) {StuID = stuID;}public String getClassNO() {return ClassNO;}public void setClassNO(String classNO) {ClassNO = classNO;}public String getStuNO() {return StuNO;}public void setStuNO(String stuNO) {StuNO = stuNO;}public String getStuName() {return StuName;}public void setStuName(String stuName) {StuName = stuName;}public String getGrade() {return Grade;}public void setGrade(String grade) {Grade = grade;}public String getSex() {return Sex;}public void setSex(String sex) {Sex = sex;}public String getBirthday() {return Birthday;}public void setBirthday(String birthday) {Birthday = birthday;}public String getPoliticalState() {return PoliticalState;}public void setPoliticalState(String politicalState) {PoliticalState = politicalState;}public String getSpecialName() {return SpecialName;}public void setSpecialName(String specialName) {SpecialName = specialName;}public String getSpecialID() {return SpecialID;}public void setSpecialID(String specialID) {SpecialID = specialID;}public String getNation() {return Nation;}public void setNation(String nation) {Nation = nation;}public String getIdentityNO() {return IdentityNO;}public void setIdentityNO(String identityNO) {IdentityNO = identityNO;}public String getEduYear() {return EduYear;}public void setEduYear(String eduYear) {EduYear = eduYear;}}

 

开始写一个Xml解析工具类

package net.utils;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.InputStream;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import net.tudentTable;import org.dom4j.Document;import org.dom4j.Element;import org.dom4j.io.SAXReader;public class XMLUtil {@SuppressWarnings("unchecked")public static List toModuleList(InputStream input, String className) {SAXReader reader = new SAXReader();reader.setValidation(false);Document document = null;List list = new ArrayList();try {// 解析xmldocument = reader.read(input);// 根节点Element root = document.getRootElement();Iterator it = root.elementIterator();// 次节点循环while (it.hasNext()) {                               // 次子节点Element nodeFirst = (Element) it.next();                                //反射                                Class objCls = Class.forName(className);Object obj = objCls.newInstance();// 获得传入实体类的所有方法Method[] methods = objCls.getMethods();for (Method getter : methods) {String name = getter.getName();Method setter = null;// 获取get方法,if (name.startsWith("get")) {//相应的set方法名String lastName = name.substring(3);String setName = "set" + lastName;//get方法返回数据的类型Class type = getter.getReturnType();try {                                                //相应的set方法setter = objCls.getMethod(setName, type);} catch (NoSuchMethodException e) {continue;}                                                //根据节点名获得相应的内容        String val = nodeFirst.elementText(lastName);//调用set方法setter.invoke(obj, val);}}list.add(obj);}} catch (Exception e) {e.printStackTrace();throw new RuntimeException("xml文件读取错误", e);}return list;}public static void main(String[] args) throws FileNotFoundException {InputStream input = new FileInputStream("studentTable.xml");List list = XMLUtil.toModuleList(input,"net.model.StudentTable");for (int i = 0; i < list.size(); i++) {StudentTable stuTable = (StudentTable) list.get(i);if (stuTable != null) {System.out.println("test" + stuTable.getStuName());System.out.println("test" + stuTable.getStuNO());}}               input.close();}}

 

其实需要同步的数据是别人提供的接口返回来的String类型的数据。用Xml模拟完之后,开始想的是先把获得的数据生成Xml,再读取xml来解析。后来才发现dom4j可以直接解析String类型的,现在知道的有两种方法

1.保留SAXReader 

Document document = new SAXReader().read(new StringReader(传入的字符串));

2.可以直接省去SAXReader

Document document = DocumentHelper.parseText(传入的字符串);

 

实体类的属性名称开头是大写,这样命名貌似不规范,但是没法了,写的时候是直接复制过来。

哈哈,现在还是菜鸟,其实如果不怕麻烦一个文件写一个解析方法是就行了; 但是,正因为菜所以才想着做成动态的解析的方式,好让自己学习巩固反射机制,这个自己用的太少了。

有什么错误还请指正~~~