/**
* 将Bean转换为XML
*
* @param clazzMap 别名-类名映射Map
* @param bean 要转换为xml的bean对象
* @return XML字符串
*/
public static String bean2xml(Map<String, Class> clazzMap, Object bean) {
XStream xstream = new XStream();
for (Iterator it = clazzMap.entrySet().iterator(); it.hasNext();) {
@SuppressWarnings("unchecked")
Map.Entry<String, Class> m = (Map.Entry<String, Class>) it.next();
xstream.alias(m.getKey(), m.getValue());
// 上面可以使用这种方法xstream.alias(obj.getClass().getSimpleName(), obj.getClass()); 利用getSimpleName得到类的简写名称
xstream.alias("HotelID", String.class);
xstream.useAttributeFor(Destination.class, "CityCode");//添加为属性1
// xstream.useAttributeFor(IsRealTime.class, "RoomCount");
xstream.registerConverter(new IsRealTime()); //添加为属性2
if(m.getKey().equals("PriceSearchRequest")){
xstream.registerConverter(new PriceRange());
}
if(m.getKey().equals("PriceConfirmRequest")){
xstream.registerConverter(new RoomOccupancy());
}
if(m.getKey().equals("HotelBookingConfirmRQ")){
xstream.useAttributeFor(Room.class, "RoomNum");
xstream.registerConverter(new Name());
}
xstream.addImplicitCollection(Room.class, "GuestInfo");
xstream.aliasSystemAttribute(null, "class"); // 去掉 class 属性
xstream.aliasPackage("", "com.dida.pojo"); //去掉包名
}
String xml = xstream.toXML(bean);
return xml;
}
/**
* 将XML转换为Bean
*
* @param clazzMap 别名-类名映射Map
* @param xml 要转换为bean对象的xml字符串
* @return Java Bean对象
*/
public static Object xml2Bean(Map<String, Class> clazzMap, String xml) {
XStream xstream = new XStream();
for (Iterator it = clazzMap.entrySet().iterator(); it.hasNext();) {
@SuppressWarnings("unchecked")
Map.Entry<String, Class> m = (Map.Entry<String, Class>) it.next();
xstream.alias(m.getKey(), m.getValue());
if (m.getKey().equals("RoomOccupancy")) {
xstream.registerConverter(new RoomOccupancy()); //取属性
}
if (m.getKey().equals("HotelBookingConfirmRS")) {
xstream.omitField(BookingDetails.class, "GuestList");
xstream.omitField(BookingDetails.class, "CustomerRequest");
xstream.omitField(BookingDetails.class, "ClientReference");
xstream.omitField(Hotel.class, "CancellationPolicyList");
xstream.omitField(Hotel.class, "CancellationPolicy");
// xstream.addImplicitCollection(Room.class, "Room");
}
if (m.getKey().equals("HotelBookingSearchRS")) {
xstream.omitField(BookingDetails.class, "GuestList");
xstream.omitField(Hotel.class, "CancellationPolicyList");
xstream.omitField(Hotel.class, "CancellationPolicy");
}
}
Object bean = xstream.fromXML(xml);
return bean;
}
//调用
Map<String, Class> map = new LinkedHashMap<String, Class>();
map.put("PriceConfirmRequest", GetPriceConfirmRequest.class);
//生成xml
String xml = bean2xml(map, bean);
//解析xml
Map<String, Class> clazzMap = new LinkedHashMap<String, Class>();
clazzMap.put("Success", Success.class);
clazzMap.put("PriceConfirmResponse", PriceConfirmResponse.class);
PriceConfirmResponse response = (PriceConfirmResponse) xml2Bean(clazzMap, result);
//Converter
package com.dida.pojo;
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;
public class RoomOccupancy implements Converter{
/**
* 房间编号,依次为1,2,3…,应和房间数对应。
*/
private String RoomNum = "1";
/**
* 大人数量
*/
private String AdultCount = "1";
public RoomOccupancy() {
}
public String getRoomNum() {
return RoomNum;
}
public void setRoomNum(String roomNum) {
RoomNum = roomNum;
}
public String getAdultCount() {
return AdultCount;
}
public void setAdultCount(String adultCount) {
AdultCount = adultCount;
}
@Override
public boolean canConvert(Class arg0) {
return arg0.equals(RoomOccupancy.class);
}
@Override
public void marshal(Object arg0, HierarchicalStreamWriter arg1,
MarshallingContext arg2) {
RoomOccupancy roomOccupancy = (RoomOccupancy)arg0;
arg1.addAttribute("RoomNum", roomOccupancy.getRoomNum());
arg1.addAttribute("AdultCount", roomOccupancy.getAdultCount());
/*if (StringUtils.isNotBlank(roomOccupancy.getChildCount()) && "0".equals(roomOccupancy.getChildCount())) {
arg1.addAttribute("ChildCount", roomOccupancy.getChildCount());
}*/
}
@Override
public Object unmarshal(HierarchicalStreamReader arg0,
UnmarshallingContext arg1) {
return new RoomOccupancy();
}
}
XStream
最新推荐文章于 2024-04-15 19:56:50 发布