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