需要的jar包
xpp3_min-1.1.4c.jar
xstream-1.3.1.jar
作用:
将xml字符串转换为java对象,或者将java对象转换为xml字符串
核心类:XStream xs = new XStream()
准备工作,先创建两个java类:City和Province
@XStreamAlias("city")
public class City {
private String name
public String getName() {
return name
}
public void setName(String name) {
this.name = name
}
}
@XStreamAlias("province")
public class Province {
@XStreamAsAttribute()
private String name
@XStreamImplicit(itemFieldName = "city")
private List citys
public List getCitys() {
return citys
}
public void setCitys(List citys) {
this.citys = citys
}
public String getName() {
return name
}
public void setName(String name) {
this.name = name
}
}
第一:将java类转换为xml字符串
XStream xs = new XStream()
String xml = xs.toXML(JavaBean)
打印的字符串会将类的包名作为xml的标签,以及里面的字段都会变成标签。
例如将City类变为xml字符串:
武汉
将Province变成xml字符串
湖北
武汉
所以为了能将打印的字符串变为我们所想要的格式,可以使用Xstream提供的注解进行格式化输出
提供便捷注解
@XStreamAlias(别名) 对类和变量设置别名
@XStreamAsAttribute 设置变量生成属性
@XStreamOmitField 设置变量 不生成到XML
@XStreamImplicit(itemFieldName = “hobbies”) 设置集合类型变量 别名
使注解生效
xStream.autodetectAnnotations(true)
第二:将xml字符串变为java对象
Object xs.fromXML(InputStream input) //将一个下买了指定的流变为java对象
Object xs.fromXML(String xml) //将xml字符串变为java对象
Object xs.fromXML(InputStream input,Object root) ?
Object xs.fromXML(String xml,Object root) ?
注意:转换的xml文档必须与Java对象 的格式对应
例如:将下面xml字符串转换为Java对象
武汉
则进行转换时候:
XStream xs = new XStream()
Object o = xs.fromXML(in)
若对应的java格式一定是:
包名为:com.domain
类名为:City
里面有一个成员属性:name 提供setter/getter方法
若不是则可以使用别名:
a.为类设置别名
xs.alias("city", City.class)
b.为属性添加别名
xstream.useAttributeFor(Blog.class,"author");
能不能通过注解将 xml转换为制定的java对象 ?
能,手动用方法添加别名
实体类要加注解
实体类要加注解@XStreamAlias("msg")
public class Msg implements Serializable {
private static final long serialVersionUID = 3196422897798539811L
@XStreamAsAttribute
private String toUid
@XStreamAsAttribute
private String fromUid
@XStreamAsAttribute
private String flag
@XStreamAsAttribute
private String time
@XStreamAlias("content")
private String content
@XStreamAlias("user")
private String user
//省略geter、seter
}
然后写个工具类
import com.thoughtworks.xstream.XStream
import com.thoughtworks.xstream.io.xml.DomDriver
public class SerializeXmlUtil {
/**
* java对象转化成xml字符串
* @param obj java对象实例
* @return String xml字符串
*/
public static String serializeToXml(Object obj) {
//XStream xstream = new XStream()
//直接用jaxp dom来解释
//XStream xstream=new XStream(new DomDriver())
//指定编码解析器,直接用jaxp dom来解释
XStream xstream=new XStream(new DomDriver("utf-8"))
//如果没有这句,xml中的根元素会是<包.类名>
//或者说:注解根本就没生效,所以的元素名就是类的属性
xstream.processAnnotations(obj.getClass())
StringBuffer xmlstrbuf = new StringBuffer()
xmlstrbuf.append("<?xml version=\"1.0\"?>")
xmlstrbuf.append("\r\n")
xmlstrbuf.append(xstream.toXML(obj))
return xmlstrbuf.toString()
}
/**
* 将传入xml字符串转化为java对象
* @param xmlstr
* @param cls xml对应的class类
* @return T xml对应的class类的实例对象
* 调用的方法实例:PersonBean person=XmlUtil.toBean(xmlStr, PersonBean.class)
*/
public static <T> T deSerizalizeFromXml(String xmlstr, Class<T> cls) throws Exception {
//注意:不是new Xstream()否则报错:java.lang.NoClassDefFoundError:
//org/xmlpull/v1/XmlPullParserFactory
XStream xstream = new XStream(new DomDriver())
xstream.processAnnotations(cls)
T obj = (T) xstream.fromXML(xmlstr)
return obj
}
}
错了吧,xstream生成的是xml体,不带头的,想要头自己拼上就行,再说<?xml author="Guilherme Silveira"?>你这个也不合法啊另外,生成xml的顶级标签是xstream.alias("xml", Blog.class)这里面的前面字符串
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)