由于目前在工作中一直用的dom4j+反射实现bean与xml的相互转换,记录一下,如果有不正确的地方欢迎大家指正~~~
一、反射机制
在此工具类中使用到了反射技术,所以提前也看了一些知识点,例如:http://www.51gjie.com/java/82(这里面有大量的例子可以学习)
二、dom4j
dom4j会将整个xml加载至内存,并解析成一个document对象,但是可能会造成内存溢出现象。
Document:表示整个xml文档。文档Document对象是通常被称为DOM树。
Element:表示一个xml元素。Element对象有方法来操作其子元素,它的文本,属性和名称空间
Attribute:表示元素的属性。属性有方法来获取和设置属性的值。它有父节点和属性类型。
Node:代表元素,属性或者处理指令。
三、dom4j读取xml
读取xml文档主要依赖于org.dom4j.io包,翻看其中源码可以看出提供DOMReader、SaxReader、XPPReader、XPP3Reader,我这里主要查看了SaxReader源码,其他的没有深入看过,所以使用SaxReader。
/*** 将xml字符串转换为Document对象
*@paramxml
*@return
*/
publicDocument getDocumentByString(String xml)
{//1.字符串输入流
StringReader stringReader = newStringReader(xml);//2.获取解析器
SAXReader saxReader = newSAXReader();//3.声明document对象
Document document = null;try{//4.解析xml,生成document对象
document =saxReader.read(stringReader);
}catch(DocumentException e)
{
log.error("xml解析失败",e);
}returndocument;
}
四、bean与xml的互转方法
我这里测试案例,查询学生学校信息,返回学校及多个学生信息。如下准备:
1.准备bean
请求实体bean:ReqSchool.java
public classReqSchool {//学校编号
privateString number;//学校名称
privateString name;//学校省份
privateString province;//学校地址
privateString address;//学生班级
privateString stuclass;//学生姓名
privateString stuname;//学生分数
privateString stuscore;//省略set和get方法
}
响应实体bean:RspSchool.java
public classRspSchool {//学校编号
privateString number;//学校名称
privateString name;//学校省份
privateString province;//学校地址
privateString address;//多个学生
private Liststudents; //模拟测试数据,返回多个学生//省略get和set方法
}
响应实体bean的泛型:RspStudent.java
public classRspStudent {//学生班级
privateString stuclass;//学生姓名
privateString stuname;//学生分数
privateString stuscore;//省略set和get方法
}
2.准备xml
①请求模版requestXML
这里以${元素名}作为请求模版,也可以修改工具类进行改造