`

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

    博客分类:
  • java
 
阅读更多

自己写了个根据传入的实体类能够动态的解析相应的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(传入的字符串);

 

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

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

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

 

 

 

分享到:
评论

相关推荐

    dom4j+反射机制

    在Java编程中,DOM4J和反射机制是两个非常重要的概念,它们分别用于处理XML文档和动态访问类的方法、属性。DOM4J是一个强大的Java XML API,提供了灵活的XML解析和操作能力,而反射机制则赋予了Java程序在运行时检查...

    dom4j+xml仿hibernate

    【标题】"dom4j+xml仿hibernate"是一个项目,旨在通过使用dom4j库处理XML文档,结合反射机制,来实现类似Hibernate的核心功能。这个项目有助于学习者深入理解和掌握Hibernate的工作原理。 【描述】在Java开发中,...

    任意XML转实体类 实体类 转XML 方法 JAVA

    总结一下,XML转实体类和实体类转XML涉及的主要知识点有:Java反射API、XML解析(DOM、SAX、StAX、JAXB),以及对象的序列化和反序列化。在实际开发中,我们需要根据项目需求选择合适的工具和方法,确保数据的准确...

    JDOM解析XML文档

    ### JDOM解析XML文档 #### 一、JDOM概述与特点 JDOM(Java Document Object Model)是一款专为Java优化的开源XML数据处理库。它虽然与W3C的DOM标准相似,但作为DOM的一种替代方案,JDOM并不是基于DOM构建的,也...

    读取文件数据并解析成bean实体类

    6. **任意文件转任意实体**:实现这一功能可能需要一种灵活的策略,如使用反射机制动态地获取Bean的类信息,并结合文件解析器来填充Bean的属性。同时,需要考虑文件编码、数据格式识别等问题。 7. **配置Class类**...

    简单实体类和xml文件的相互转换方法

    总之,这个例子展示了如何使用Java和DOM4J库将一组实体类对象转换为XML文件,以及反向将XML文件转换回实体类。通过反射和泛型,可以实现对不同类型实体类的通用处理。虽然示例代码仅处理了简单的数据类型,但通过...

    各种转换,xml,实体bean,动态bean,map等

    在Java中,我们可以使用JAXB(Java Architecture for XML Binding)进行XML与Java对象之间的双向...DOM(Document Object Model)、SAX(Simple API for XML)和StAX(Streaming API for XML)等API来解析和生成XML文档...

    JAVA_API1.6文档(中文)

    javax.xml.crypto.dsig.dom javax.xml.crypto.dsig 包特定于 DOM 的类。 javax.xml.crypto.dsig.keyinfo 用来解析和处理 KeyInfo 元素和结构的类。 javax.xml.crypto.dsig.spec XML 数字签名的参数类。 javax.xml...

    hibernate开发所依赖的jar包

    6. **反射和序列化支持**:`asm-3.3.1.jar`, `cglib-nodep-2.2.2.jar`, `dom4j-1.6.1.jar`, 和 `javassist-3.12.1.GA.jar` - 这些库用于动态代理、XML解析和对象的序列化,它们是Hibernate实现元对象工厂和动态代理...

    hibernate4必备jar包

    7. **编译和运行时依赖**:`dom4j-*.jar`, `xml-apis-*.jar`, `jaxen-*.jar` - 用于XML处理,如解析和生成XML文档,Hibernate的HQL和Criteria API使用这些库。 8. **缓存支持**:`ehcache-*.jar` - Ehcache是一个...

    hibernate需要的jar包

    3. **dom4j.jar**:Hibernate使用DOM4J解析和操作XML配置文件,以及生成HQL查询结果的XML表示。 4. **slf4j-api.jar**和**slf4j-log4j12.jar**:SLF4J是日志门面,允许在应用中选择不同的日志实现。log4j是具体的...

    [Java参考文档]

    javax.xml.crypto.dsig.dom javax.xml.crypto.dsig 包特定于 DOM 的类。 javax.xml.crypto.dsig.keyinfo 用来解析和处理 KeyInfo 元素和结构的类。 javax.xml.crypto.dsig.spec XML 数字签名的参数类。 javax.xml...

    JavaAPI中文chm文档 part2

    javax.xml.crypto.dsig.dom javax.xml.crypto.dsig 包特定于 DOM 的类。 javax.xml.crypto.dsig.keyinfo 用来解析和处理 KeyInfo 元素和结构的类。 javax.xml.crypto.dsig.spec XML 数字签名的参数类。 javax.xml...

    JavaAPI1.6中文chm文档 part1

    javax.xml.crypto.dsig.dom javax.xml.crypto.dsig 包特定于 DOM 的类。 javax.xml.crypto.dsig.keyinfo 用来解析和处理 KeyInfo 元素和结构的类。 javax.xml.crypto.dsig.spec XML 数字签名的参数类。 javax.xml...

    hibernate所需jar包

    6. **dom4j-*.jar**:这是一个XML文档模型库,Hibernate使用它来处理XML配置文件和HQL结果集的XML表示。 7. **javassist-*.jar**:Java编程辅助工具,提供运行时字节码操作和转换,Hibernate利用它来实现动态代理和...

    orm框架的底层实现机制共.pdf

    2. **XML解析**:DOM4J是一个Java库,用于处理XML文件,包括解析、创建和修改XML文档。在Hibernate中,DOM4j被用来解析配置文件,获取数据库连接信息和其他映射细节。 3. **Java反射机制**:反射是Java的一种高级...

    java api最新7.0

    javax.xml.crypto.dsig.dom javax.xml.crypto.dsig 包特定于 DOM 的类。 javax.xml.crypto.dsig.keyinfo 用来解析和处理 KeyInfo 元素和结构的类。 javax.xml.crypto.dsig.spec XML 数字签名的参数类。 javax.xml....

Global site tag (gtag.js) - Google Analytics