1.  

  

  1. package com.brmoney.util.obj2xml;
  2.  
  3. import java.util.Iterator;
  4. import java.util.List;
  5.  
  6. import org.dom4j.Document;
  7. import org.dom4j.DocumentException;
  8. import org.dom4j.DocumentHelper;
  9. import org.dom4j.Element;
  10.  
  11. import com.brmoney.flight.pojo.DomeTicketPsg;
  12. import com.brmoney.util.resource.FieldResourceBundle;
  13. import com.thoughtworks.xstream.XStream;
  14. import com.thoughtworks.xstream.io.xml.DomDriver;
  15. import com.thoughtworks.xstream.converters.Converter;
  16.  
  17. public class Object2Xml {
  18.  
  19. static DomDriver domDriver = null;
  20. static Converter xmlNullConverter = null;
  21.  
  22. static {
  23. domDriver = new DomDriver();
  24. xmlNullConverter = new XmlNullConverter();
  25. }
  26.  
  27. public static String compare2Object(Object obj1, Object obj2)
  28. throws DocumentException {
  29. XStream stream = new XStream(domDriver);
  30. stream.registerConverter(xmlNullConverter);
  31. String xml1 = stream.toXML(obj1);
  32. String xml2 = stream.toXML(obj2);
  33.  
  34. Document doc1 = DocumentHelper.parseText(xml1);
  35. Document doc2 = DocumentHelper.parseText(xml2);
  36.  
  37. StringBuffer buffer = new StringBuffer();
  38. List<Element> elements = doc1.selectNodes(obj1.getClass().getName());
  39. List<Element> unElements = doc2.selectNodes(obj1.getClass().getName());
  40. for (int i = 0; i < elements.size(); i++) {
  41. Element rootElement = elements.get(i);
  42. Element unRootElement = unElements.get(i);
  43. if (rootElement != null && unRootElement != null) {
  44. Iterator eles = rootElement.elementIterator();
  45. Iterator unEles = unRootElement.elementIterator();
  46. while (eles.hasNext() && unEles.hasNext()) {
  47. Element e = (Element) eles.next();
  48. Element ue = (Element) unEles.next();
  49. if (e.getName().equals(ue.getName())
  50. && !e.getTextTrim().equals(ue.getTextTrim())) {
  51. String[] config = FieldResourceBundle.getMessage(
  52. e.getName(), obj1.getClass().getSimpleName())
  53. .split("[|]");
  54. if (config[0] != null) {
  55. buffer.append(config[0]).append(":").append("由")
  56. .append(e.getTextTrim()).append(
  57. "  更改为:  ")
  58. .append(ue.getTextTrim()).append("\n");
  59. }
  60. }
  61. }
  62. }
  63.  
  64. }
  65. return buffer.toString();
  66. }
  67.  
  68. public static void main(String[] args) throws DocumentException {
  69. DomeTicketPsg psg1 = new DomeTicketPsg();
  70. psg1.setPsgName("项羽");
  71. DomeTicketPsg psg2 = new DomeTicketPsg();
  72. psg2.setPsgName("刘备");
  73.  
  74. System.out.print(Object2Xml.compare2Object(psg1, psg2));
  75.  
  76. }
  77.  
  78. }

  

  1. package com.brmoney.util.obj2xml;
  2.  
  3. import java.lang.reflect.InvocationTargetException;
  4. import java.lang.reflect.Method;
  5. import java.text.DateFormat;
  6. import java.util.ArrayList;
  7. import java.util.Calendar;
  8. import java.util.Date;
  9. import java.util.HashMap;
  10. import java.util.List;
  11. import java.util.Locale;
  12. import java.util.Map;
  13.  
  14. import com.thoughtworks.xstream.converters.Converter;
  15. import com.thoughtworks.xstream.converters.MarshallingContext;
  16. import com.thoughtworks.xstream.converters.UnmarshallingContext;
  17. import com.thoughtworks.xstream.io.HierarchicalStreamReader;
  18. import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
  19.  
  20. /**
  21. * 自定义XStream转化器,
  22. * 使null值标签可以输出到XML
  23. */
  24. @SuppressWarnings("unchecked")
  25. public class XmlNullConverter implements Converter
  26. {
  27.  
  28. private Map<Class<?>, List<String>> attributes = null;
  29.  
  30. public void regAttribute(Class<?> type, String attribute)
  31. {
  32. if (null == attributes)
  33. {
  34. attributes = new HashMap<Class<?>, List<String>>();
  35. }
  36.  
  37. List value = attributes.get(type);
  38. if (null == value)
  39. {
  40. value = new ArrayList<String>();
  41. attributes.put(type, value);
  42. }
  43.  
  44. value.add(attribute);
  45. }
  46.  
  47. /**
  48. * 是否是属性(是属性的不用以单独标签实现)
  49. * @param type
  50. * @param attribute
  51. * @return
  52. */
  53. private boolean isClassAttribute(Class<?> type, String attribute)
  54. {
  55. List<String> value = getAttributes(type);
  56. if (null == value)
  57. return false;
  58. if (value.contains(attribute))
  59. {
  60. return true;
  61. }
  62. return false;
  63. }
  64.  
  65. /**
  66. * 获取注册的属性
  67. * @param type
  68. * @return
  69. */
  70. private List<String> getAttributes(Class<?> type)
  71. {
  72. if (null != attributes)
  73. {
  74. return attributes.get(type);
  75. }
  76. return null;
  77. }
  78.  
  79. /**
  80. * 输出对象的属性标签
  81. * @param source
  82. * @param writer
  83. */
  84. private void writerAttribute(Object source, HierarchicalStreamWriter writer)
  85. {
  86. Class cType = source.getClass();
  87. List<String> value = getAttributes(cType);
  88. if ((null != value) && (value.size() > 0))
  89. {
  90. Method[] methods = cType.getMethods();
  91. for (Method method : methods)
  92. {
  93. String methodName = method.getName();
  94. if (methodName.indexOf("get") != -1 && methodName != "getClass")
  95. {
  96. String name = methodName.substring(3);
  97. //首字母小写
  98. name = name.substring(0, 1).toLowerCase()+name.substring(1);
  99. if (value.contains(name))
  100. {
  101. Object o = null;
  102. try {
  103. o = method.invoke(source, null);
  104. } catch (Exception e) {
  105. e.printStackTrace();
  106. }
  107. writer.addAttribute(name, o==null?"":o.toString());
  108. }
  109. }
  110. }
  111. }
  112. }
  113.  
  114. public void marshal(Object source, HierarchicalStreamWriter writer,
  115. MarshallingContext context)
  116. {
  117. if (null == source)
  118. return;
  119. if (isBaseType(source.getClass()))
  120. {
  121. return;
  122. }
  123. Class cType = source.getClass();
  124. Method[] methods = cType.getMethods();
  125. writerAttribute(source, writer);
  126. for(Method m : methods)
  127. {
  128. String methodName = m.getName();
  129. if (methodName.indexOf("get") != -1 && methodName != "getClass")
  130. {
  131. if (source instanceof List)
  132. {
  133. List list = (List)source;
  134. for (Object obj: list)
  135. {
  136. String name = obj.getClass().toString();
  137. name = name.substring(name.lastIndexOf(".") + 1);
  138.  
  139. writer.startNode(name);
  140. marshal(obj, writer, context);
  141. writer.endNode();
  142. }
  143. }
  144. else
  145. {
  146. boolean isBaseType = isBaseType(m.getReturnType());
  147. String name = methodName.substring(3);
  148. if (isBaseType)
  149. {
  150. name = name.substring(0, 1).toLowerCase()+name.substring(1);
  151. }
  152. Object o = null;
  153. try
  154. {
  155. o = m.invoke(source, null);
  156. } catch (IllegalArgumentException e)
  157. {
  158. e.printStackTrace();
  159. } catch (IllegalAccessException e)
  160. {
  161. e.printStackTrace();
  162. } catch (InvocationTargetException e)
  163. {
  164. e.printStackTrace();
  165. }
  166. //如果是基本类型调用toString,否则递归
  167. if (isBaseType)
  168. {
  169. if (!isClassAttribute(cType, name))
  170. {
  171. writer.startNode(name);
  172. if (m.getReturnType().equals(Date.class)&&o!=null&&!"".equals(o.toString()))
  173. {
  174. Date date = (Date)o;
  175. DateFormat formatter = DateFormat.getDateInstance(DateFormat.FULL,new Locale("zh", "CN"));
  176. writer.setValue(formatter.format(date));
  177. }else{
  178. writer.setValue(o==null?"":o.toString());
  179. }
  180. writer.endNode();
  181. }
  182. }
  183. else
  184. {
  185. writer.startNode(name);
  186. marshal(o, writer, context);
  187. writer.endNode();
  188. }
  189. }
  190. }
  191. }
  192. }
  193.  
  194. public Object unmarshal(HierarchicalStreamReader reader,
  195. UnmarshallingContext context) {
  196. return null;
  197. }
  198.  
  199. public boolean canConvert(Class type) {
  200. return true;
  201. }
  202.  
  203. private boolean isBaseType(Class<?> type)
  204. {
  205. if (type.equals(Integer.class)
  206. || type.equals(Double.class)
  207. || type.equals(String.class)
  208. || type.equals(Boolean.class)
  209. || type.equals(Long.class)
  210. ||type.equals(Short.class)
  211. ||type.equals(Byte.class)
  212. ||type.equals(Float.class)
  213. ||type.equals(Date.class))
  214. {
  215. return true;
  216. }
  217. return false;
  218. }
  219. }

  

  1. package com.brmoney.util.resource;
  2.  
  3. import java.util.Locale;
  4. import java.util.ResourceBundle;
  5.  
  6. public class FieldResourceBundle {
  7.  
  8. private static String baseKey = "datafield/";
  9.  
  10. public static String getMessage(String key,String propName){
  11. Locale locale = new Locale("zh", "CN");
  12. ResourceBundle bundle = ResourceBundle.getBundle(baseKey+propName, locale);
  13. if(bundle.containsKey(key)){
  14. return bundle.getString(key);
  15. }
  16. return "";
  17. }
  18.  
  19. }

  

xstream+dom4j比较对象的更多相关文章

  1. XStream将java对象转换为xml时,对象字段中的下划线“_”,转换后变成了两个的解决办法

            在前几天的一个项目中,由于数据库字段的命名原因 其中有两项:一项叫做"市场价格"一项叫做"商店价格" 为了便于区分,遂分别将其命名为market ...

  2. Java对象表示方式2:XStream实现对对象的XML化

    上一篇文章讲到了使用Java原生的序列化的方式来表示一个对象.总结一下这种对象表示方式的优缺点: 1.纯粹的Java环境下这种方式可以很好地工作,因为它是Java自带的,也不需要第三方的Jar包的支持 ...

  3. XStream转换Java对象与XML

    1.引入需要的jar包,在pom.xml中配置依赖 <dependency> <groupId>com.thoughtworks.xstream</groupId> ...

  4. XStream类的对象将javaBean转成XML

    [省市联动] servlet端: //返回数据xml(XStream) XStream xStream = new XStream(); //把路径设置别名 xStream.alias("c ...

  5. Spring Boot 使用 Dom4j XStream 操作 Xml

    Xml 现在仍然占据着比较重要的地位,比如微信接口中使用了 Xml 进行消息的定义.本章重点讨论 Xml 的新建.编辑.查找.转化,可以这么理解,本章是使用了 dom4j.xstream 也是在开发者 ...

  6. 使用XStream是实现XML与Java对象的转换(6)--持久化

    九.持久化 在第八节的示例中,当我们操作一组对象时,我们可以指定Writer.OutputStream来写出序列化后的XML数据,我们还可以指定Reader.InputStream来读取序列化后的XM ...

  7. 使用XStream是实现XML与Java对象的转换(1)--简介及入门示例

    一.简单介绍 XStream是thoughtworks开发的开源框架,用于实现XML数据于Java对象.Json数据的转换.它不需要schema或其他的mapping文件就可以进行java对象和xml ...

  8. Javaweb学习笔记——(二十三)——————AJAX、XStream、JSON

    AJAX概述     1.什么是AJAX         ajax(Asynchronous JavaScript and xml) 翻译成中文就是"异步JavaScript和xml&quo ...

  9. atitit.XML类库选型及object 对象bean 跟json转换方案

    atitit.XML类库选型及object 对象bean 跟json转换方案 1. XML类库可以分成2大类.标准的.这些类库通常接口和实现都是分开的 1 2. 常见的xml方面的方法 2 2.1.  ...

随机推荐

  1. V2EX 神回复 #1

    "抠图"用英文怎么说 今天突然被"抠图"这个单词给难住了," image segmentation "," image cut & ...

  2. Quartz 配置文件属性

    主要配置 Property Name Req'd Type Default Value org.quartz.scheduler.instanceName no string 'QuartzSched ...

  3. “System.AccessViolationException”类型的未经处理的异常在 System.Data.dll 中发生 其他信息: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏

    用管理员身份运行CMD:netsh winsock reset就可以解决

  4. Bootstrap历练实例:响应式标签页

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  5. Bootstrap历练实例:弹出框(popover)事件

    事件 下表列出了弹出框(Popover)插件中要用到的事件.这些事件可在函数中当钩子使用. 事件 描述 实例 show.bs.popover 当调用 show 实例方法时立即触发该事件. $('#my ...

  6. OpenFaceswap 入门教程(2):软件使用篇!

    安装完OpenFaceswap之后,是不是就迫不及待的想要“见证奇迹”了呢? 都说磨刀不误砍柴工.开始之前请先做一个准备.然后大致了解一下换脸的过程 换脸基本步骤是: 把视频切成很多图片 把图片中的人 ...

  7. PHP 根据IP获取地理位置

    /** * 根据用户IP获取用户地理位置 * $ip 用户ip */ function get_position($ip){ if(empty($ip)){ return '缺少用户ip'; } $u ...

  8. 为什么选择Redis

    1)Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储.    2)Redis支持master-slave(主-从)模式应用    3)Redi ...

  9. 02.VUE学习二之数据绑定

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  10. python2与python3的区别,以及注释、变量、常量与编码发展

    python2与python3的区别 宏观上: python2:源码不统一,混乱,重复代码太多. python3:源码统一标准,能去除重复代码. 编码上: python2:默认编码方式为ASCII码. ...