xstream+dom4j比较对象
- package com.brmoney.util.obj2xml;
- import java.util.Iterator;
- import java.util.List;
- import org.dom4j.Document;
- import org.dom4j.DocumentException;
- import org.dom4j.DocumentHelper;
- import org.dom4j.Element;
- import com.brmoney.flight.pojo.DomeTicketPsg;
- import com.brmoney.util.resource.FieldResourceBundle;
- import com.thoughtworks.xstream.XStream;
- import com.thoughtworks.xstream.io.xml.DomDriver;
- import com.thoughtworks.xstream.converters.Converter;
- public class Object2Xml {
- static DomDriver domDriver = null;
- static Converter xmlNullConverter = null;
- static {
- domDriver = new DomDriver();
- xmlNullConverter = new XmlNullConverter();
- }
- public static String compare2Object(Object obj1, Object obj2)
- throws DocumentException {
- XStream stream = new XStream(domDriver);
- stream.registerConverter(xmlNullConverter);
- String xml1 = stream.toXML(obj1);
- String xml2 = stream.toXML(obj2);
- Document doc1 = DocumentHelper.parseText(xml1);
- Document doc2 = DocumentHelper.parseText(xml2);
- StringBuffer buffer = new StringBuffer();
- List<Element> elements = doc1.selectNodes(obj1.getClass().getName());
- List<Element> unElements = doc2.selectNodes(obj1.getClass().getName());
- for (int i = 0; i < elements.size(); i++) {
- Element rootElement = elements.get(i);
- Element unRootElement = unElements.get(i);
- if (rootElement != null && unRootElement != null) {
- Iterator eles = rootElement.elementIterator();
- Iterator unEles = unRootElement.elementIterator();
- while (eles.hasNext() && unEles.hasNext()) {
- Element e = (Element) eles.next();
- Element ue = (Element) unEles.next();
- if (e.getName().equals(ue.getName())
- && !e.getTextTrim().equals(ue.getTextTrim())) {
- String[] config = FieldResourceBundle.getMessage(
- e.getName(), obj1.getClass().getSimpleName())
- .split("[|]");
- if (config[0] != null) {
- buffer.append(config[0]).append(":").append("由")
- .append(e.getTextTrim()).append(
- " 更改为: ")
- .append(ue.getTextTrim()).append("\n");
- }
- }
- }
- }
- }
- return buffer.toString();
- }
- public static void main(String[] args) throws DocumentException {
- DomeTicketPsg psg1 = new DomeTicketPsg();
- psg1.setPsgName("项羽");
- DomeTicketPsg psg2 = new DomeTicketPsg();
- psg2.setPsgName("刘备");
- System.out.print(Object2Xml.compare2Object(psg1, psg2));
- }
- }
- package com.brmoney.util.obj2xml;
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- import java.text.DateFormat;
- import java.util.ArrayList;
- import java.util.Calendar;
- import java.util.Date;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Locale;
- import java.util.Map;
- import com.thoughtworks.xstream.converters.Converter;
- import com.thoughtworks.xstream.converters.MarshallingContext;
- import com.thoughtworks.xstream.converters.UnmarshallingContext;
- import com.thoughtworks.xstream.io.HierarchicalStreamReader;
- import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
- /**
- * 自定义XStream转化器,
- * 使null值标签可以输出到XML
- */
- @SuppressWarnings("unchecked")
- public class XmlNullConverter implements Converter
- {
- private Map<Class<?>, List<String>> attributes = null;
- public void regAttribute(Class<?> type, String attribute)
- {
- if (null == attributes)
- {
- attributes = new HashMap<Class<?>, List<String>>();
- }
- List value = attributes.get(type);
- if (null == value)
- {
- value = new ArrayList<String>();
- attributes.put(type, value);
- }
- value.add(attribute);
- }
- /**
- * 是否是属性(是属性的不用以单独标签实现)
- * @param type
- * @param attribute
- * @return
- */
- private boolean isClassAttribute(Class<?> type, String attribute)
- {
- List<String> value = getAttributes(type);
- if (null == value)
- return false;
- if (value.contains(attribute))
- {
- return true;
- }
- return false;
- }
- /**
- * 获取注册的属性
- * @param type
- * @return
- */
- private List<String> getAttributes(Class<?> type)
- {
- if (null != attributes)
- {
- return attributes.get(type);
- }
- return null;
- }
- /**
- * 输出对象的属性标签
- * @param source
- * @param writer
- */
- private void writerAttribute(Object source, HierarchicalStreamWriter writer)
- {
- Class cType = source.getClass();
- List<String> value = getAttributes(cType);
- if ((null != value) && (value.size() > 0))
- {
- Method[] methods = cType.getMethods();
- for (Method method : methods)
- {
- String methodName = method.getName();
- if (methodName.indexOf("get") != -1 && methodName != "getClass")
- {
- String name = methodName.substring(3);
- //首字母小写
- name = name.substring(0, 1).toLowerCase()+name.substring(1);
- if (value.contains(name))
- {
- Object o = null;
- try {
- o = method.invoke(source, null);
- } catch (Exception e) {
- e.printStackTrace();
- }
- writer.addAttribute(name, o==null?"":o.toString());
- }
- }
- }
- }
- }
- public void marshal(Object source, HierarchicalStreamWriter writer,
- MarshallingContext context)
- {
- if (null == source)
- return;
- if (isBaseType(source.getClass()))
- {
- return;
- }
- Class cType = source.getClass();
- Method[] methods = cType.getMethods();
- writerAttribute(source, writer);
- for(Method m : methods)
- {
- String methodName = m.getName();
- if (methodName.indexOf("get") != -1 && methodName != "getClass")
- {
- if (source instanceof List)
- {
- List list = (List)source;
- for (Object obj: list)
- {
- String name = obj.getClass().toString();
- name = name.substring(name.lastIndexOf(".") + 1);
- writer.startNode(name);
- marshal(obj, writer, context);
- writer.endNode();
- }
- }
- else
- {
- boolean isBaseType = isBaseType(m.getReturnType());
- String name = methodName.substring(3);
- if (isBaseType)
- {
- name = name.substring(0, 1).toLowerCase()+name.substring(1);
- }
- Object o = null;
- try
- {
- o = m.invoke(source, null);
- } catch (IllegalArgumentException e)
- {
- e.printStackTrace();
- } catch (IllegalAccessException e)
- {
- e.printStackTrace();
- } catch (InvocationTargetException e)
- {
- e.printStackTrace();
- }
- //如果是基本类型调用toString,否则递归
- if (isBaseType)
- {
- if (!isClassAttribute(cType, name))
- {
- writer.startNode(name);
- if (m.getReturnType().equals(Date.class)&&o!=null&&!"".equals(o.toString()))
- {
- Date date = (Date)o;
- DateFormat formatter = DateFormat.getDateInstance(DateFormat.FULL,new Locale("zh", "CN"));
- writer.setValue(formatter.format(date));
- }else{
- writer.setValue(o==null?"":o.toString());
- }
- writer.endNode();
- }
- }
- else
- {
- writer.startNode(name);
- marshal(o, writer, context);
- writer.endNode();
- }
- }
- }
- }
- }
- public Object unmarshal(HierarchicalStreamReader reader,
- UnmarshallingContext context) {
- return null;
- }
- public boolean canConvert(Class type) {
- return true;
- }
- private boolean isBaseType(Class<?> type)
- {
- if (type.equals(Integer.class)
- || type.equals(Double.class)
- || type.equals(String.class)
- || type.equals(Boolean.class)
- || type.equals(Long.class)
- ||type.equals(Short.class)
- ||type.equals(Byte.class)
- ||type.equals(Float.class)
- ||type.equals(Date.class))
- {
- return true;
- }
- return false;
- }
- }
- package com.brmoney.util.resource;
- import java.util.Locale;
- import java.util.ResourceBundle;
- public class FieldResourceBundle {
- private static String baseKey = "datafield/";
- public static String getMessage(String key,String propName){
- Locale locale = new Locale("zh", "CN");
- ResourceBundle bundle = ResourceBundle.getBundle(baseKey+propName, locale);
- if(bundle.containsKey(key)){
- return bundle.getString(key);
- }
- return "";
- }
- }
xstream+dom4j比较对象的更多相关文章
- XStream将java对象转换为xml时,对象字段中的下划线“_”,转换后变成了两个的解决办法
在前几天的一个项目中,由于数据库字段的命名原因 其中有两项:一项叫做"市场价格"一项叫做"商店价格" 为了便于区分,遂分别将其命名为market ...
- Java对象表示方式2:XStream实现对对象的XML化
上一篇文章讲到了使用Java原生的序列化的方式来表示一个对象.总结一下这种对象表示方式的优缺点: 1.纯粹的Java环境下这种方式可以很好地工作,因为它是Java自带的,也不需要第三方的Jar包的支持 ...
- XStream转换Java对象与XML
1.引入需要的jar包,在pom.xml中配置依赖 <dependency> <groupId>com.thoughtworks.xstream</groupId> ...
- XStream类的对象将javaBean转成XML
[省市联动] servlet端: //返回数据xml(XStream) XStream xStream = new XStream(); //把路径设置别名 xStream.alias("c ...
- Spring Boot 使用 Dom4j XStream 操作 Xml
Xml 现在仍然占据着比较重要的地位,比如微信接口中使用了 Xml 进行消息的定义.本章重点讨论 Xml 的新建.编辑.查找.转化,可以这么理解,本章是使用了 dom4j.xstream 也是在开发者 ...
- 使用XStream是实现XML与Java对象的转换(6)--持久化
九.持久化 在第八节的示例中,当我们操作一组对象时,我们可以指定Writer.OutputStream来写出序列化后的XML数据,我们还可以指定Reader.InputStream来读取序列化后的XM ...
- 使用XStream是实现XML与Java对象的转换(1)--简介及入门示例
一.简单介绍 XStream是thoughtworks开发的开源框架,用于实现XML数据于Java对象.Json数据的转换.它不需要schema或其他的mapping文件就可以进行java对象和xml ...
- Javaweb学习笔记——(二十三)——————AJAX、XStream、JSON
AJAX概述 1.什么是AJAX ajax(Asynchronous JavaScript and xml) 翻译成中文就是"异步JavaScript和xml&quo ...
- atitit.XML类库选型及object 对象bean 跟json转换方案
atitit.XML类库选型及object 对象bean 跟json转换方案 1. XML类库可以分成2大类.标准的.这些类库通常接口和实现都是分开的 1 2. 常见的xml方面的方法 2 2.1. ...
随机推荐
- V2EX 神回复 #1
"抠图"用英文怎么说 今天突然被"抠图"这个单词给难住了," image segmentation "," image cut & ...
- Quartz 配置文件属性
主要配置 Property Name Req'd Type Default Value org.quartz.scheduler.instanceName no string 'QuartzSched ...
- “System.AccessViolationException”类型的未经处理的异常在 System.Data.dll 中发生 其他信息: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏
用管理员身份运行CMD:netsh winsock reset就可以解决
- Bootstrap历练实例:响应式标签页
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- Bootstrap历练实例:弹出框(popover)事件
事件 下表列出了弹出框(Popover)插件中要用到的事件.这些事件可在函数中当钩子使用. 事件 描述 实例 show.bs.popover 当调用 show 实例方法时立即触发该事件. $('#my ...
- OpenFaceswap 入门教程(2):软件使用篇!
安装完OpenFaceswap之后,是不是就迫不及待的想要“见证奇迹”了呢? 都说磨刀不误砍柴工.开始之前请先做一个准备.然后大致了解一下换脸的过程 换脸基本步骤是: 把视频切成很多图片 把图片中的人 ...
- PHP 根据IP获取地理位置
/** * 根据用户IP获取用户地理位置 * $ip 用户ip */ function get_position($ip){ if(empty($ip)){ return '缺少用户ip'; } $u ...
- 为什么选择Redis
1)Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储. 2)Redis支持master-slave(主-从)模式应用 3)Redi ...
- 02.VUE学习二之数据绑定
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...
- python2与python3的区别,以及注释、变量、常量与编码发展
python2与python3的区别 宏观上: python2:源码不统一,混乱,重复代码太多. python3:源码统一标准,能去除重复代码. 编码上: python2:默认编码方式为ASCII码. ...