xtream的工具使用

xtream的工具使用,第1张

Xstream

需要的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)这里面的前面字符串


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11339753.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存