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比较对象的更多相关文章

  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. IOS 某个控件出不来原因(经验分享)

    某个控件出不来:(检查原因) 1.frame的尺寸和位置对不对 2.hidden是否为YES 3.有没有添加到父控件中 4.alpha 是否 < 0.01 5.被其他控件挡住了 6.父控件的前面 ...

  2. HTTP 请求方法介绍

    浏览器从 web 服务器(或者叫应用服务器)上使用 HTTP 协议下载网站,HTTP 协议是基于一种 请求-响应(request-response)模型的.客户端(你的浏览器)从运行在物理机器上的 w ...

  3. 响应式网站布局要适应的当下主流手机屏幕的各个版本的分辨率有哪些(media query)

    CSS宽有14种: 320.360.375.384.400.414.533.600.768.800.853.1024.1280.1366 CSS高有16种: 360.480.533.568.569.6 ...

  4. Matlab将多幅图片保存为mat

    %% 储存某目录所有的图片 pt = 'd:\imgs\'; ext = '*.jpg'; dis = dir([pt ext]); nms = {dis.name}; for k = 1:lengt ...

  5. 阿里云服务器下安装LAMP环境(CentOS Linux 6.3) 安装与配置 FTP 服务器

    我们经常会使用 FTP,把本地电脑上的文件上传到服务器上,或者把服务器上的文件下载到自己的电脑里面.FTP 有服务端和客户端,FTP 的服务端提供了这种传输文件的服务,FTP 的客户端提供了传输文件的 ...

  6. shiro学习记录(二)

    1 在项目中应用shiro框架进行认证 第一步:引入shiro框架相关的jar <!-- 引入shiro框架的依赖 --> <dependency> <groupId&g ...

  7. React后台管理系统-首页Home组件

    1.Home组件要显示用户总数.商品总数和订单总数,数据请求后端的 /manage/statistic/base_count.do接口,返回的是 this.state = {            u ...

  8. 单例Singleton

    先提供一个完整版: // .h文件 @interface SingleTon : NSObject /** 获取单例对象 */ + (instancetype)sharedInstance; + (i ...

  9. JavaScript深拷贝与浅拷贝的理解

    个人是这么理解深拷贝和浅拷贝的:就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,拿人手短,如果B没变,那就是深拷贝,自食其力. 一起看看我举的浅拷贝栗子: let ...

  10. CentOS7 ngnix 的安装和配置

    刚开始我也在纠结到底是该用Apache呢还是Nginx?然后网上各种查看了它俩的对比,总结了它俩最大区别在于apache是同步多进程模型,在处理动态有优势:nginx是异步的,并发性能比较好,cpu内 ...