基于Dom4j实现javaBean转xml的功能
Posted 樱岛麻衣Ss
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于Dom4j实现javaBean转xml的功能相关的知识,希望对你有一定的参考价值。
一、前言
前面实现了xml转javaBean的功能,今天继续完成javaBean转xml的功能。这一块实现的比较早
现在看来可能有很多可以优化的地方(也说明了我有成长)
二、 公共方法还是ReflectDTO
作用和前面一样也是标识作用,如有问题请移步之前面一章
https://www.cnblogs.com/ydmysm/p/hhb_parseXml.html
三、功能实现
3.1、基础功能。 主要是生成Dom4j的Document对象,解码格式、根节点
private static final String XML_ENCODING="UTF-8";
//请求一级结点
private static final String REQUEST_ROOT_NODE="request";
//返回一级结点
private static final String RESPONSE_ROOT_NODE="response";
/**
* 构造xml格式
* @param o
* @return
*/
public static String buildRequestXml(Object o){
//生成头部信息
Document document = generateRootNode();
//添加根节点
Element element = document.addElement(REQUEST_ROOT_NODE);
//构造子结点
buildXml(o,element);
//返回
try {
return new String(document.asXML().getBytes(), "UTF-8");
} catch (UnsupportedEncodingException e) {
throw new BadRequestAlertException("不支持的编码格式");
}
}
private static void buildXml(Object o,Element root){
//生成子结点
try {
//递归构造ducument
transXmlFromDTO(o,root,null);
} catch (IllegalAccessException e) {
throw new BadRequestAlertException("对象转XML格式失败");
}
}
private static Document generateRootNode(){
//生成头部
Document xml= DocumentHelper.createDocument();
//设置解码格式
xml.setXMLEncoding(XML_ENCODING);
//添加一级结点--request
return xml;
}
3.2、核心方法,递归实现Document的构造,根据属性类型进行不同的处理方法。
/**
* 请求对象转XML
* @param obj
* @param rootElement
* @param childName
* @throws InvocationTargetException
* @throws IllegalAccessException
*/
private static <T> void transXmlFromDTO(Object obj,Element rootElement,String childName) throws IllegalAccessException {
Class clazz = obj.getClass();
//获取属性的数组
Field[] declaredFields = clazz.getDeclaredFields();
//添加子节点,如果childName为空的话,子节点默认等于根节点
Element childElement=rootElement;
if (null!=childName){
childElement = rootElement.addElement(childName);
}
//遍历带转换的dto
for (Field field:declaredFields){
//设置可到达
field.setAccessible(true);
//获取属性的值
Object fieldValue = field.get(obj);
//获取属性的类信息
Class fieldType = field.getType();
//为空直接返回
if (null==fieldValue||field.getName().equals("this$0")){
continue;
}
//String
if (fieldType.equals(String.class)){
String name=field.getName();
//特殊字符package处理
if ("package002".equals(name)){
name="package";
}
//添加子节点
Element element = childElement.addElement(name);
//添加值
element.addText((String)fieldValue);
//继续
continue;
}
//如果有属性类型为List
if (fieldType.equals(List.class)&&field.getGenericType() instanceof ParameterizedType){
//获取列表数据
List<Object> list = (List<Object>)fieldValue;
//遍历
for (Object childObj:list){
transXmlFromDTO(childObj,childElement,field.getName());
}
continue;
}
//如果是Integer类型
if (fieldValue instanceof Integer){
//添加子节点
Element element = childElement.addElement(field.getName());
//添加值
element.addText(((Integer) field.get(obj)).toString());
continue;
}
//如果为Double
if (fieldValue instanceof Double){
//添加子节点
Element element = childElement.addElement(field.getName());
//添加值
element.addText(field.get(obj).toString());
continue;
}
//对象
if (fieldValue instanceof ReflectDTO){
//添加子节点
transXmlFromDTO(fieldValue,childElement,field.getName());
continue;
}
}
}
四、结束
这里是我的一些使用心得,如果能够帮到大家我非常荣幸。也开心有朋友提出相关优化或者更好的实现一起学习,
共同进步。(直接调用api的就不用了)
以上是关于基于Dom4j实现javaBean转xml的功能的主要内容,如果未能解决你的问题,请参考以下文章