XStream转换java对象与XML

XStream是一个Java对象和XML相互转换的工具,很好很强大。提供了所有的基础类型、数组、集合等类型直接转换的支持。因此XML常用于数据交换、对象序列化(这种序列化和Java对象的序列化技术有着本质的区别)。

XStream对象相当Java对象和XML之间的转换器,转换过程是双向的。创建XSteam对象的方式很简单,只需要new XStream()即可。
Java到xml,用toXML()方法。
Xml到Java,用fromXML()方法。

别名配置包含三种情况:
1、类别名,用alias(String name, Class type)。
2、类成员别名,用aliasField(String alias, Class definedIn, String fieldName)(alias是别名,definedIn是类名,fieldName类中的变量名)
3、类成员作为属性别名,用 aliasAttribute(Class definedIn, String attributeName, String alias)(definedIn是类名,attributeName是类中的属性名,alias是设置后的别名); 单独命名没有意义,还要通过useAttributeFor(Class definedIn, String fieldName)(definedIn是类名,fieldName是要将类中fieldName属性作为属性) 应用到某个类上。

addImplicitCollection(Class ownerType, String fieldName),去掉集合类型生成xml的父节点。

下面来个例子:

package com.entity;
import java.util.ArrayList;
import java.util.List;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
public class InputMessage {
    private String FromUserName;
    private String AgentType;
    private String ItemCount;
    private String PackageId;
    
    private List<InputMessageItem> Item = new ArrayList<InputMessageItem>();
    
    public String getFromUserName() {
        return FromUserName;
    }

    public void setFromUserName(String fromUserName) {
        FromUserName = fromUserName;
    }

	public String getAgentType() {
		return AgentType;
	}

	public void setAgentType(String agentType) {
		AgentType = agentType;
	}

	public String getItemCount() {
		return ItemCount;
	}

	public void setItemCount(String itemCount) {
		ItemCount = itemCount;
	}

	public String getPackageId() {
		return PackageId;
	}

	public void setPackageId(String packageId) {
		PackageId = packageId;
	}

	public List<InputMessageItem> getItem() {
		return Item;
	}

	public void setItem(List<InputMessageItem> item) {
		Item = item;
	}
}


package com.entity;
import com.thoughtworks.xstream.annotations.XStreamImplicit;

public class InputMessageItem {
	
	private String FromUserName;
	private Long CreateTime;
	private String MsgType;
	private String Event;
	
    private InputMessageReceiver Receiver;
    
	public String getFromUserName() {
		return FromUserName;
	}
	public void setFromUserName(String fromUserName) {
		FromUserName = fromUserName;
	}
	public Long getCreateTime() {
		return CreateTime;
	}
	public void setCreateTime(Long createTime) {
		CreateTime = createTime;
	}
	public String getMsgType() {
		return MsgType;
	}
	public void setMsgType(String msgType) {
		MsgType = msgType;
	}
	public String getEvent() {
		return Event;
	}
	public void setEvent(String event) {
		Event = event;
	}
	public InputMessageReceiver getReceiver() {
		return Receiver;
	}
	public void setReceiver(InputMessageReceiver receiver) {
		this.Receiver = receiver;
	}
}


package com.entity;

public class InputMessageReceiver {
	private String Type;
	private String Id;
	
	public String getType() {
		return Type;
	}
	public void setType(String type) {
		this.Type = type;
	}
	public String getId() {
		return Id;
	}
	public void setId(String id) {
		this.Id = id;
	}
}


package com.seeyon.weixin.collaboration.controller;

import com.entity.InputMessage;
import com.entity.InputMessageItem;
import com.entity.InputMessageReceiver;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;

public class TextXML {
	public static void test(){
		String xml = "<xml><ItemCount>1</ItemCount><PackageId>429496729768324897</PackageId><Item><FromUserName><![CDATA[zhangsan]]></FromUserName></Item><Item><FromUserName><![CDATA[lisi]]></FromUserName><Receiver><Type>single</Type><Id>wangwu</Id></Receiver></Item></xml>";
		
        //将POST流转换为XStream对象
        XStream xs = new XStream(new DomDriver());
        
        //将指定节点下的xml节点数据映射为对象
        xs.alias("xml", InputMessage.class);
        xs.alias("Item", InputMessageItem.class);
        xs.alias("Receiver", InputMessageReceiver.class);
        
        //去掉集合类型生成xml的父节点
        xs.addImplicitArray(InputMessage.class, "Item");
        
        //将ItemCount别名设置为haha
        xs.aliasField("haha", InputMessage.class, "ItemCount");
        
        //将InputMessage类的ItemCount、PackageId设置为属性
        xs.useAttributeFor(InputMessage.class, "PackageId"); 
        /*************  设置属性的别名 ***************/ 
        xs.aliasAttribute(InputMessage.class, "PackageId", "attribute"); 
        
        //把xml转换为java对象
        InputMessage inputMessage = (InputMessage) xs.fromXML(xml); 
      
        //把java对象转换为xml
        String XML = xs.toXML(inputMessage);
        System.out.println(xs.fromXML(xml).toString());
		System.out.println(XML);
        
	}
	public static void main(String[] args) {
		test();
	}
}

原始xml:

<xml>
  <ItemCount>1</ItemCount>
  <PackageId>429496729768324897</PackageId>
  <Item>
    <FromUserName><![CDATA[zhangsan]]></FromUserName>
  </Item>
  <Item>
    <FromUserName><![CDATA[lisi]]></FromUserName>
    <Receiver>
      <Type>single</Type>
      <Id>wangwu</Id>
    </Receiver>
  </Item>
</xml>


输出结果:

<xml attribute="429496729768324897">
  <haha>1</haha>
  <Item>
    <FromUserName>zhangsan</FromUserName>
  </Item>
  <Item>
    <FromUserName>lisi</FromUserName>
    <Receiver>
      <Type>single</Type>
      <Id>wangwu</Id>
    </Receiver>
  </Item>
</xml>


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值