自己写了个根据传入的实体类能够动态的解析相应的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(传入的字符串);
实体类的属性名称开头是大写,这样命名貌似不规范,但是没法了,写的时候是直接复制过来。
哈哈,现在还是菜鸟,其实如果不怕麻烦一个文件写一个解析方法是就行了; 但是,正因为菜所以才想着做成动态的解析的方式,好让自己学习巩固反射机制,这个自己用的太少了。
有什么错误还请指正~~~