一、前言
前面实现了xml转javaBean的功能,今天继续完成javaBean转xml的功能。这一块实现的比较早
现在看来可能有很多可以优化的地方(也说明了我有成长)
三、功能实现
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;
}
}
}
</object></object></t>
四、结束
这里是我的一些使用心得,如果能够帮到大家我非常荣幸。也开心有朋友提出相关优化或者更好的实现一起学习,
共同进步。(直接调用api的就不用了)
Original: https://www.cnblogs.com/ydmysm/p/hhb_readValue.html
Author: 樱岛麻衣Ss
Title: 基于Dom4j实现javaBean转xml的功能
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/610476/
转载文章受原作者版权保护。转载请注明原作者出处!