转换 java 类到 xml 文档的学习

apache 的 betwixt 组件可以实现 java 类到 xml 文档的转换,但有一定的局限性,如果需要一个写下面这个类的理由的话,“尽其能则用”吧!

(1) IBeanToXml.java 接口。

package com.flysoft.fuse4j.support.xbean;

/**
* IBeanToXml 接口实现将任意对象转换为数据岛或XML的方法。
* flysoft company.
* @author Dingli.
* 2008 Apr 22, 2008 5:56:26 PM
*/
public interface IBeanToXml
{
/**
* 将一个类解析成 XML 格式。
* @param object 要进行解析的类。
* @param encoding 使用的字符集。
* @return 返回解析后的 XML 字符串。
*/
public String parseBeanToXml(Object object, String encoding);

/**
* 将一个类解析成数据岛格式。
* @param id 数据岛的ID。
* @param object 要解析的对象。
* @param encoding 使用的字符集。
* @return 返回解析后的数据岛字符串。
*/
public String parseBeanToDataIsland(String id, Object object, String encoding);
}

(2) BeanToXmlParser.java 类。

package com.flysoft.fuse4j.support.xbean;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.dom4j.Document;
import org.dom4j.DocumentFactory;
import org.dom4j.Element;

/**
* BeanToXmlParser 类实现将任意对象转换为数据岛或XML,但对象不能循环引用自身。
* flysoft company.
* @author Dingli.
* 2008 Apr 22, 2008 5:41:07 PM
*/
public class BeanToXmlParser implements IBeanToXml
{
//log4j日志记录器。
private static final Log logger = LogFactory.getLog(BeanToXmlParser.class);
//简单日期格式化对象。
private static final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");

/**
* 构建默认的 BeanToXmlParser 对象。
*/
public BeanToXmlParser()
{}

/*
* (non-Javadoc)
* @see com.flysoft.fuse4j.support.xbean.IBeanToXml#parseBeanToXml(java.lang.Object, java.lang.String)
*/
public String parseBeanToXml(Object object, String encoding)
{
try
{
//应为递归可能很消耗资源,先进行垃圾回收。
System.gc();
//传入的对象必须不能为空。
if(object != null)
{
//获取传入对象的全类名。
String classPath = object.getClass().getName();
//获取传入对象的类名。
String className = classPath.substring(classPath.lastIndexOf(".") + 1);
//构建文档工厂类对象。
DocumentFactory documentFactory = DocumentFactory.getInstance();
//构建文档类对象。
Document document = documentFactory.createDocument(encoding.toUpperCase());
//添加根节点。
document.addElement(className);
//获取文档根节点。
Element rootNode = document.getRootElement();
//添加根元素的 "class" 属性。
rootNode.addAttribute("class", classPath);
//插入根元素。
insertElement(rootNode, className.toLowerCase(), object);
//返回表示该文档的 XML 字符串。
return document.asXML();
}
else
{
return null;
}
}
catch(Exception ex)
{
logger.error("Parse object to xml string fail", ex);
return null;
}
}

/*
* (non-Javadoc)
* @see com.flysoft.fuse4j.support.xbean.IBeanToXml#parseBeanToDataIsland(java.lang.String, java.lang.Object, java.lang.String)
*/
public String parseBeanToDataIsland(String id, Object object, String encoding)
{
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("<xml id=\"{id}\">");
stringBuffer.append(parseBeanToXml(object, encoding));
stringBuffer.append("</xml>");
return stringBuffer.toString().replaceAll("[{]id[}]", id);
}

/**
* 插入节点到父节点元素。
* @param parentNode 父节点元素。
* @param nodeName 要插入的节点名。
* @param object 要插入的节点对象。
*/
private void insertElement(Element parentNode, String nodeName, Object object)
{
//如果传入的对象为空,则转换为空字符串。
object = (object == null)? "": object;
//父元素节点和传入的对象均不能为空。
if(parentNode != null)
{
//表示当前元素节点。
Element currentNode = null;
//获取传入对象的全类名。
String classPath = object.getClass().getName();
//获取传入对象的类名。
String className = classPath.substring(classPath.lastIndexOf(".") + 1).toLowerCase();
//传入的对象为基本数据类型。
if(isBaseDataType(object.getClass()))
{
//如果节点名不为空,添加的元素名为节点名,否则为传入类的类名。
currentNode = parentNode.addElement((nodeName != null && !nodeName.equals(""))? nodeName: className);
//添加子节点的值。
currentNode.addText((object instanceof Date)? BeanToXmlParser.simpleDateFormat.format(object): object.toString());
}
//传入的对象为集合类型。
else if(object instanceof Collection)
{
//插入集合中的对象到元素。
insertElementFromCollection(parentNode, object);
}
//传入的对象为Map类型。
else if(object instanceof Map)
{
//插入Map中的对象到元素。
insertElementFromMap(parentNode, object);
}
//其他类类型(自定义类型)。
else
{
//插入自定义的对象到元素。
insertElementFromOtherObject(parentNode, object);
}
}
}

/**
* 插入节点到父节点元素。
* @param parentNode 父节点元素。
* @param object 要插入的节点对象。
*/
private void insertElement(Element parentNode, Object object)
{
insertElement(parentNode, null, object);
}

/**
* 获取自定义对象中的元素做为节点插入父节点。
* @param parentNode 父节点。
* @param object 要获取元素的对象。
*/
private void insertElementFromOtherObject(Element parentNode, Object object)
{
//表示当前元素节点。
Element currentNode = null;
//表示字段名。
String fieldName = null;
//表示类中的getter方法名。
String methodName = null;
//表示通过getter方法取得的对象。
Object fieldObject = null;
//返回类所定义的字段。
Field[] fields = object.getClass().getDeclaredFields();
//遍历所有类字段对象。
for(int i = 0; i < fields.length; i++)
{
//获取单个字段对象。
Field field = fields[i];
//获取字段名。
fieldName = field.getName();
//获取以getter起始的方法名。
methodName = "get" + Character.toUpperCase(fieldName.charAt(0))+ fieldName.substring(1);
try
{
//获取所有的方法对象。
Method method = object.getClass().getMethod(methodName, null);
//判断getter方法是否为public。
if(Modifier.isPublic(method.getModifiers()))
{
//判断从getter方法获取的对象是否为空。
if((fieldObject = method.invoke(object, null)) != null && !isBaseDataType(fieldObject.getClass()))
{
//用字段名为节点名添加一个节点元素到指定的父节点。
currentNode = parentNode.addElement(fieldName);
//添加该节点元素的"class"属性。
currentNode.addAttribute("class", fieldObject.getClass().getName());
//添加节点元素到当前新插入的节点下。
insertElement(currentNode, fieldName, fieldObject);
}
else
{
//添加节点元素节点到父节点下。
insertElement(parentNode, fieldName, fieldObject);
}
}
}
catch(NoSuchMethodException nex)
{}
catch(Exception ex)
{
logger.error("Get class field fail", ex);
}
}
}

/**
* 获取Map中的元素做为节点插入父节点。
* @param parentNode 父节点。
* @param object 要获取元素的对象。
*/
private void insertElementFromMap(Element parentNode, Object object)
{
//获取传入对象的全类名(包括包名)。
String classPath = null;
//获取传入对象的类名(不包括包名)。
String className = null;
//表示Map的键。
Object key = null;
//表示Map的值。
Object value = null;
//表示当前元素节点。
Element currentNode = null;
//转换Object为Map类型。
Map map = (Map)object;
//判断传入的对象是否为空。
if(map != null)
{
//遍历所有键集合。
for(Iterator keyIterator = map.keySet().iterator(); keyIterator.hasNext();)
{
//判断取得的Map中的键是否为空。
if((key = keyIterator.next()) != null)
{
//判断子元素是否不为空。
if((value = map.get(key)) != null)
{
//判断子元素是否不为基本数据类型。
if(!isBaseDataType(value.getClass()))
{
//获取传入对象的全类名(包括包名)。
classPath = value.getClass().getName();
//获取传入对象的类名(不包括包名)。
className = classPath.substring(classPath.lastIndexOf(".") + 1);
//添加元素到当前元素。
currentNode = parentNode.addElement(className);
//添加元素的class属性。
currentNode.addAttribute("class", classPath);
//插入到当前元素。
insertElement(currentNode, value);
}
else
{
//插入到父元素。
insertElement(parentNode, key.toString(), value);
}
}
}
}
}
}

/**
* 获取集合中的元素做为节点插入父节点。
* @param parentNode 父节点。
* @param object 要获取元素的对象。
*/
private void insertElementFromCollection(Element parentNode, Object object)
{
//表示当前元素节点。
Element currentNode = null;
//获取传入对象的全类名(包括包名)。
String classPath = null;
//获取传入对象的类名(不包括包名)。
String className = null;
//转换为集合接口对象。
Collection collection = (Collection)object;
//集合的子元素。
Object subObject = null;
//集合对象不能为空。
if(collection != null)
{
//遍历所有的集合元素。
for(Iterator iterator = collection.iterator(); iterator.hasNext();)
{
//判断获取的集合的子元素是否为空。
if((subObject = iterator.next()) != null)
{
//判断子元素是否不为一个基本数据类型。
if(!isBaseDataType(subObject.getClass()))
{
//获取传入对象的全类名(包括包名)。
classPath = subObject.getClass().getName();
//获取传入对象的类名(不包括包名)。
className = classPath.substring(classPath.lastIndexOf(".") + 1);
//添加元素到当前元素。
currentNode = parentNode.addElement(className);
//添加元素的class属性。
currentNode.addAttribute("class", classPath);
//插入到当前元素。
insertElement(currentNode, subObject);
}
else
{
//插入到父元素。
insertElement(parentNode, subObject);
}
}
}
}
}

/**
* 判断一个类是否为基本数据类型。
* @param clazz 要判断的类。
* @return true 表示为基本数据类型。
*/
private boolean isBaseDataType(Class clazz)
{
return
(
clazz.equals(String.class) ||
clazz.equals(Integer.class)||
clazz.equals(Byte.class) ||
clazz.equals(Long.class) ||
clazz.equals(Double.class) ||
clazz.equals(Float.class) ||
clazz.equals(Character.class) ||
clazz.equals(Short.class) ||
clazz.equals(BigDecimal.class) ||
clazz.equals(BigInteger.class) ||
clazz.equals(Boolean.class) ||
clazz.equals(Date.class) ||
clazz.isPrimitive()
);
}
}

用一个 main() 方法来简单表明如何使用。

public class MainClass
{
public static void main(String[] args) throws Exception
{
try
{
List rootList = new ArrayList();
List subList = new ArrayList();
rootList.add("name");
rootList.add(new Integer(100));
rootList.add(new Float(100.1F));
rootList.add(new Double(100.01D));
subList.add(new Integer(100));
subList.add(new Float(100.1F));
subList.add(new Double(100.01D));
rootList.add(subList);
//java 类到 xml 文档的解析器。
BeanToXmlParser beanToXmlParser = new BeanToXmlParser();
//转换为 xml 字符串。
System.out.println(beanToXmlParser.parseBeanToXml(rootList));
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
}

千万不要问为什么我都是在贴代码,我是个实用主义者。如果你有好的点子,长篇大论一番后。那么,“please, share !”。一个 java 类就像一个故事,有自己的生命。构思良好的类不仅可以让你事半功倍,而且也极像一件艺术品。与其让别人听你的滔滔大论,不如直接让他们看你是如何做的。虽然“授人以鱼,不如授之以渔”,但“抛砖引玉”也未尝不可!

近来身体微恙,但对她的感觉却从来没有减少过,她的映像占据了我的大部分“硬盘空间”,以至于我的“硬盘”七零八落,需要“碎片整理”下了。她对我还是爱理不睬,虽然她就在我的左座,我有时候会偷偷瞄她(是不是我很没有出息),真希望有一天她能接受我,就像当初我接受 java 一样(虽然我不知道我是否选对),我会像喜欢 java 一样深深的爱护着她(感觉是不是在这里谈这些有点跑题了)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
# 智慧旅游解决方案摘要 智慧旅游解决方案旨在通过新一代信息网络技术和装备,实现旅游服务、管理、营销和体验的智能化。该方案响应国家政策背景,如国家旅游局和工业信息化部的指导意见,以及国家发改委的发展规划,强调数字化、网络化、智能化在旅游业的应用,推动5G和移动互联网技术在旅游领域的创新应用。 方案的建设目标围绕“一个中心、四个方面、五大平台”展开,即以智慧旅游数据中心为核心,面向服务、管理、商务和营销构建智慧景区管理平台、智慧旅游服务平台、智慧旅游商务平台和智慧旅游营销平台。这五大平台将整合全域旅游资源,提升旅游设施,拓展旅游空间,融合旅游产业链,提升旅游服务,定制旅游产品,推进旅游改革。 建设内容涵盖了整体架构的构建,包括智慧服务、智慧管理、电子商务和智慧营销等方面。通过云计算、人工智能、大数据、物联网、5G等技术,实现“云-管-端”服务能力,打造集时间、空间、层次为一体的体验平台。此外,还包括智慧景区管理平台的多个子系统,如视频监控、应急指挥调度、流量监测、舆情监督、线路SOS一键呼救、GIS人车调度、停车场管理、语音广播、环境监测管理、多媒体发布、电子巡更以及指挥调度大屏建设等。 智慧旅游服务平台则包括自助票务系统、人脸识别、扫码购票、景区门户网站、机游、WIFI覆盖系统、数字全景VR、AI机器人、智慧座椅、智慧厕所等,旨在提升游客体验,实现景区的智能化管理和服务。通过这些服务,游客可以享受到便捷的购票、入园、导览和信息服务,同时景区管理者能够更有效地监控和管理景区运营。 智慧旅游商务平台则侧重于旅行社团队申报、电子商城、综合票务系统、分销管理系统、大会员系统和景区聚合支付系统,为旅游企业提供全面的商务服务和营销支持。这些平台和系统帮助旅游企业拓宽分销渠道,实现财务管理和订单管理,同时为游客提供便捷的支付和会员服务。 最后,智慧营销平台通过综合票务系统、分销管理系统、大会员系统和景区聚合支付系统,为旅游行业提供精准的营销工具和策略。这些工具和策略有助于整合旅游资源,拓宽销售渠道,提升游客体验,实现旅游业务的数字化和智能化。 智慧旅游解决方案通过这些综合性的技术和平台,不仅提升了游客的旅游体验,还为旅游行业的可持续发展提供了强有力的技术支持和数据驱动的决策依据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值