公司通信协议一直都使用xml方式。最近中心服务更换框架。又把我原来写xml工具类修改了一下。原来是依赖jdom。现在修改成dom4j。
正好也跟大家分享一下。至于性能我倒是没测试过。还是有点担心。主要使用的java反射机制实现。目前对List可以支持。对set,map还没实现。不过应该和list大同小异。
代码如下:
package com.megaeyes.fin.utill;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.dom.DOMDocument;
import org.dom4j.dom.DOMElement;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.megaeyes.fin.common.Constants;
import com.megaeyes.fin.common.Message;
import com.megaeyes.fin.po.Tablet;
/**
* xml工具类,依赖于dom4j解析
*
* @author dengbin
*
*/
public class XmlUtil {
protected static final Logger logger = LoggerFactory.getLogger(XmlUtil.class);
/*========================================================解析XML==================================================================*/
/**
* xml字符串转对象
* @param xmlstr
* @param clazz 目标对象类型
* @return
*/
public static Object stringToObject(String xmlstr,Class<?> clazz){
Document doc = stringToXml(xmlstr);
try{
Element root = doc.getRootElement();
@SuppressWarnings("unchecked")
Iterator<Element> iters = root.elementIterator();
return findObject(iters,clazz);
}catch(Exception e){
e.printStackTrace();
}
return null;
}
/**
* xml字符串转集合
* @param xmlstr
* @param clazz list中对象类型
* @return
*/
public static List<Object> stringToList(String xmlstr,Class<?> clazz){
Document doc = stringToXml(xmlstr);
try{
Element root = doc.getRootElement();
@SuppressWarnings("unchecked")
Iterator<Element> iters = root.elementIterator();
return findList(iters,clazz);
}catch(Exception e){
e.printStackTrace();
}
return null;
}
/**
* 字符串转换成Document对象
*
* @param xmlStr
* xml字符串
* @return Document
*/
protected static Document stringToXml(String xmlStr) {
try {
if (xmlStr == null || "".equals(xmlStr))
return null;
else {
return DocumentHelper.parseText(xmlStr);
}
} catch (Exception e) {
logger.error(e.getMessage());
return null;
}
}
/**
* 解析xml,递归需找子集
* @param iters
* @param clazz
* @return
*/
protected static Object findObject(Iterator<Element> iters,Class<?> clazz) {
Attribute attr=null;
try {
Object object = clazz.newInstance();
while (iters.hasNext()) {
Element item = (Element) iters.next();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
if(isSimpleType(field.getType())){
attr = item.attribute(field.getName());
if(attr==null)
continue;
setter(object, firstLetterToUpper(field.getName()),
attr.getValue(),
field.getType());
}else if(List.class == field.getType()){
ParameterizedType pt = (ParameterizedType) field.getGenericType();
Class<?> childzz = (Class<?>)pt.getActualTypeArguments()[0];
@SuppressWarnings("unchecked")
Iterator<Element> children = item.elementIterator();
Object o =findList(children,childzz);
setter(object, firstLetterToUpper(field.getName()),o,field.getType());
}else{
@SuppressWarnings("unchecked")
Iterator<Element> children = item.elementIterator();
System.out.println(field.getType().getCanonicalName());
Object o =findObject(children,field.getType());
setter(object, firstLetterToUpper(field.getName()),o,field.getType());
}
}
return object;
}
} catch (Exception e) {
logger.error(e.getMessage());
}
return null;
}
/**
* 解析xml,递归需找子集
* @param iters
* @param clazz
* @return
*/
protected static List<Object> findList(Iterator<Element> iters,Class<?> clazz) {
List<Object> list = new ArrayList<Object>();
try {
while (iters.hasNext()) {
Object object = clazz.newInstance();
Element item = (Element) iters.next();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
if(isSimpleType(field.getType())){
setter(object, firstLetterToUpper(field.getName()),
item.attribute(field.getName()).getValue(),
field.getType());
}else if(List.class == field.getType()){
ParameterizedType pt = (ParameterizedType) field.getGenericType();
Class<?> childzz = (Class<?>)pt.getActualTypeArguments()[0];
@SuppressWarnings("unchecked")
Iterator<Element> children = item.elementIterator();
Object o =findList(children,childzz);
setter(object, firstLetterToUpper(field.getName()),o,field.getType());
}else{
@SuppressWarnings("unchecked")
Iterator<Element> children = item.elementIterator();
Object o =findObject(children,field.getType());
setter(object, firstLetterToUpper(field.getName()),o,field.getType());
}
}
list.add(object);
}
return list;
} catch (Exception e) {
logger.error(e.getMessage());
}
return null;
}
/*=============================================================封装XML================================================================*/
/**
* 对象转xml字符串
* @param obj
* @return
*/
public static String objectToString(Object obj){
Document doc = ObjectToXml(obj);
return XmlToString(doc);
}
/**
* Document对象转换成字符串
*
* @param doc
* Document对象
* @return xml字符串
*/
protected static String XmlToString(Document doc) {
if (doc == null)
return null;
else
return doc.asXML();
}
/**
* 对象转换成Document,spring已包含类似功能
*
* @param object
* 对象
* @param scheme
* 模式
* @param nodeType
* 节点名称类型
* @return Document
*/
protected static Document ObjectToXml(Object object) {
if (object == null)
return null;
else {
Document doc = new DOMDocument();
if (object instanceof List) {
for (Object obj : (List<?>) object) {
findObject(doc, obj);
}
} else if (object instanceof Set) {
for (Object obj : (Set<?>) object) {
findObject(doc, obj);
}
} else {
findObject(doc, object);
}
return doc;
}
}
/**
* 组装xml
* @param root
* @param object
*/
protected static void findObject(Document root, Object object) {
Class<?> clazz = object.getClass();
Field[] fields = clazz.getDeclaredFields();
Element element=null;
element= new DOMElement(clazz.getSimpleName());
for (Field field : fields) {
parseChildren(field, element, object);
}
root.add(element);
}
@SuppressWarnings("deprecation")
protected static void parseChildren(Field field, Element element, Object object) {
Class<?> type = field.getType();
if (isSimpleType(type)) {
try{
element.setAttributeValue(
field.getName(),
toString(getter(object, firstLetterToUpper(field.getName()))));
}catch(Exception e){}
} else {
try {
Object child = getter(object,
firstLetterToUpper(field.getName()));
if(child instanceof List){
for(Object obj : (List<?>)child){
Element chidElelment= new DOMElement(obj.getClass().getSimpleName());
Field[] fields = obj.getClass().getDeclaredFields();
for (Field chidField : fields) {
parseChildren(chidField, chidElelment, obj);
}
element.add(chidElelment);
}
}else{
if (child != null) {
Element chidElelment =null;
chidElelment= new DOMElement(child.getClass().getSimpleName());
Field[] chidFields = child.getClass().getDeclaredFields();
for (Field chidField : chidFields)
parseChildren(chidField, chidElelment, child);
element.add(chidElelment);
}
}
} catch (Exception e) {
e.printStackTrace();
logger.error(e.getMessage());
}
}
}
/*===============================================================公用方法================================================================*/
/**
* 简单数据类型判断
* @param type 数据类型
* @return
*/
protected static boolean isSimpleType(Class<?> type){
if (type == String.class
|| type == int.class || type == Integer.class
|| type == double.class || type == Double.class
|| type == char.class || type == Character.class
|| type == long.class || type == Long.class
|| type == float.class || type == Float.class
|| type == byte.class || type == Byte.class
|| type == boolean.class || type == Boolean.class
|| type == short.class || type == Short.class
|| type==Date.class) {
return true;
}else{
return false;
}
}
/**
* 调用对象的属性get方法
*
* @param obj
* @param att
* @return
* @throws NoSuchMethodException
* @throws SecurityException
* @throws InvocationTargetException
* @throws IllegalAccessException
* @throws IllegalArgumentException
*/
protected static Object getter(Object obj, String att) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
Method method = obj.getClass().getMethod("get" + att);
return method.invoke(obj);
}
/**
* 调用对象属性的set方法
*
* @param obj
* @param att
* @param value
* @param type
*/
protected static void setter(Object obj, String att, Object value, Class<?> type) {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:sss");
try {
Method method = obj.getClass().getMethod("set" + att, type);
if (type == String.class)
method.invoke(obj, toString(value));
else if (type == Integer.class || type == int.class)
method.invoke(obj, toInteger(value));
else if (type == double.class || type == Double.class)
method.invoke(obj, toDouble(value));
else if(type == char.class || type == Character.class)
method.invoke(obj,toCharacter(value));
else if(type == long.class || type == Long.class)
method.invoke(obj,toLong(value));
else if(type == float.class || type == Float.class)
method.invoke(obj,toFloat(value));
else if(type == byte.class || type == Byte.class)
method.invoke(obj,toByte(value));
else if(type == boolean.class || type == Boolean.class)
method.invoke(obj,toBoolean(value));
else if(type == short.class || type == Short.class)
method.invoke(obj,toShort(value));
else if(type == java.util.Date.class){
method.invoke(obj, df.parse(String.valueOf(value)));
}
else
method.invoke(obj,value);
} catch (Exception e) {
logger.error(e.getMessage());
}
}
/**
* 首字母大写
*
* @param str
* @return
*/
protected static String firstLetterToUpper(String str) {
char[] array = str.toCharArray();
array[0] -= 32;
return String.valueOf(array);
}
/**
* 首字母小写
*
* @param str
* @return
*/
protected static String firstUpperToLetter(String str) {
char[] array = str.toCharArray();
array[0] += 32;
return String.valueOf(array);
}
/**
* 对象转换成字符串
*
* @param object
* @return
*/
protected static String toString(Object object) {
if (object == null)
return "";
else
return object.toString();
}
/**
* 对象转换成整形
*
* @param object
* @return
*/
protected static Integer toInteger(Object object) {
String str = toString(object);
if ("".equals(str))
return 0;
else
return Integer.parseInt(str);
}
/**
* 对象转换成double
* @param object
* @return
*/
protected static Double toDouble(Object object){
String str = toString(object);
if("".equals(str))
return 0.0;
else
return Double.parseDouble(str);
}
/**
* 对象转换成float
* @param object
* @return
*/
protected static Float toFloat(Object object){
String str = toString(object);
if("".equals(str))
return 0.0f;
else
return Float.parseFloat(str);
}
/**
* 对象转换成long
* @param object
* @return
*/
protected static Long toLong(Object object){
String str = toString(object);
if("".equals(str))
return 0l;
else
return Long.parseLong(str);
}
/**
* 对象转换成booean
* @param object
* @return
*/
protected static Boolean toBoolean(Object object){
String str = toString(object);
if("".equals(str))
return true;
else
return Boolean.parseBoolean(str);
}
/**
* 对象转换成short
* @param object
* @return
*/
protected static Short toShort (Object object){
String str = toString(object);
if("".equals(str))
return 0;
else
return Short.parseShort(str);
}
/**
* 对象转换成byte
* @param object
* @return
*/
protected static Byte toByte(Object object){
String str = toString(object);
if("".equals(str))
return 0;
else
return Byte.parseByte(str);
}
/**
* 对象转换成char
* @param object
* @return
*/
protected static Character toCharacter(Object object){
if(object==null)
return '\u0beb';
else
return (Character) object;
}
}
- 浏览: 972520 次
最新评论
-
JueLie:
规划规划
【Java线程】锁机制:synchronized、Lock、Condition -
yuejingjiahong:
android自带Json API -
ti_an_1989:
所以这种情况是不使用launchMode为singleTask ...
android Task,launcherMode对返回键与laucher的影响 -
IXHONG:
http://itlong.com
依赖注入和控制反转 -
lookstorm:
好文
java内存模型
相关推荐
在描述中提到的博客文章“一次代码重构之旅-快速读写xml文件工具类封装”,作者分享了如何通过Java进行XML操作的优化,将原始的XML处理代码整合到一个工具类中,提供简洁易用的API。在阅读该博客文章的过程中,我们...
本文将详细讲解如何使用Java实现XML到Map以及Map到XML的一键转换,并介绍一个已封装好的工具类`EasyXmlUtil`。 首先,XML到Map的转换涉及到XML的解析。在Java中,我们可以使用`javax.xml.parsers....
"java常用工具类封装"是指将常见的功能如线程管理、数据解析、第三方库集成等进行封装,以提高代码的可重用性和可维护性。下面我们将深入探讨这些知识点: 1. **线程池**: Java中的线程池是由`java.util....
本篇将详细讲解基于Java的XML文件解析与封装工具类的实现,以及相关的核心知识点。 首先,我们有两个关键的文件:`XmlObject.java` 和 `XmlParser.java`。`XmlObject.java` 可能是用于表示Java对象的类,而`Xml...
在Java开发中,为了方便与Redis进行交互,通常会封装一个工具类,本文将详细介绍如何封装一个基于Redis操作字符串的工具类。 在`RedisPoolUtils`这个类中,我们可以看到它是对Jedis或Lettuce等Redis客户端的进一步...
总结来说,"基于tinyxml2的xml操作库再封装"项目为C++开发者提供了一个高效、易用的XML处理工具,通过优化和扩展tinyxml2的功能,使得XML数据的处理变得更加直观和便捷。这将极大地提高开发效率,降低开发成本,尤其...
在实际开发中,我们可以根据需求选择适合的解析方式,并将其封装为工具类。例如,可以创建一个XMLUtil类,包含上述三种解析方法,并提供统一的接口供外部调用。同时,还可以添加XML的序列化功能,即把Java对象转换为...
Linq处理xml的工具类 处理Xml文档的封装 包含了linq处理xml的基本操作
本篇文章将深入探讨如何使用自定义的工具类`AppUtil`来简化JSON和XML的生成过程。 首先,JSON是一种轻量级的数据交换格式,它基于JavaScript语法,但独立于语言,易于人阅读和编写,同时也易于机器解析和生成。JSON...
javascript封装的通用解析和操作xml文件数据工具类(含测试使用代码) javascript封装的通用解析和操作xml文件数据工具类(含测试使用代码) 测试数据: <?xml version="1.0" encoding="UTF-8"?> <root> <book> ...
微信支付工具类是一系列用于处理微信支付业务的Java类,它们封装了与微信支付接口交互的逻辑,使得开发者能够更方便地集成微信支付功能到自己的应用程序中。以下是对这些类的功能和作用的详细说明: 1. **WXPay....
总之,"C++XML读写封装类"是C++开发中一个实用的工具,它简化了XML操作,提高了代码的可读性和可维护性。通过理解和使用这样的封装类,开发者可以更高效地处理XML数据,无论是在配置文件、数据交换还是序列化等方面...
"XMLHelper 封装类"是针对XML操作进行封装的一个工具类,旨在简化XML的读写操作,提高开发效率。以下将详细介绍XMLHelper类可能包含的功能和使用方法。 1. **XML解析**:XMLHelper可能包含了对XML文档的解析功能,...
本文将深入探讨如何封装一个Gson解析工具类,以优雅地处理JSON数据,尤其是避免在解析过程中遇到`String`为`null`时产生的错误。 首先,我们需要引入Gson库。如果你的项目是Maven项目,可以在pom.xml文件中添加以下...
数据表格以XML格式存储在XML文档中,通过tinyxml工具解析XML来读取数据库,然后在MFC可编辑表格中实现数据的添加、删除、查询,最后通过重新组装XML格式文档来保存数据库。 特点:不依赖ACCESS数据库和SQL SEVER等...
**AFNetworking网络请求封装工具类详解** 在iOS应用开发中,网络请求是不可或缺的一部分,而AFNetworking作为一款强大的网络请求库,被广泛应用于各种项目之中。本篇文章将深入解析一个基于AFNetworking封装的网络...
描述中的其他两个工具类可能包含了处理这些复杂情况的代码,但具体实现需要根据实际XML结构进行调整。 5. **自定义转换逻辑**:在处理复杂XML时,可能需要编写自定义的转换逻辑。例如,当XML节点对应于Java对象的...
在本案例中,我们讨论的是一个使用Jython来处理XML的工具类,该类封装了一些基本的DOM4J操作,提供了对XML文档的解析和操作功能。 DOM4J是一个强大的Java XML API,它提供了灵活且高效的DOM、SAX和StAX接口,使得...
这里提到的"对分页进行了封装,PageUtil.java工具类"是一个Java实现的分页辅助类,它的主要目标是简化分页查询的操作,提供更便捷的API给开发者使用。 `PageUtil.java`工具类可能包含了以下功能: 1. **参数处理**...
总的来说,C++封装的XML类在VS2005环境下提供了便利的XML操作工具,使得XML编程变得更加简单和高效。通过深入理解XML类的设计和实现,你可以更好地利用这个工具,提升软件项目的开发效率和质量。