xstreamjava的简单介绍

博主:adminadmin 2022-12-15 11:30:09 63

今天给各位分享xstreamjava的知识,其中也会对进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

java程序中使用xstream方法将实体类转成xml,实体类中有null值,生成的xml就去除了含有null值的节点!

XStream 用法详解 java 类与 XML 互换

现在 WEB数据交换的时代,传送XML目前是一个比较流行的方式,具有统一的规则约束,为实现后台接口提供了一个很方便的实现。

我编写了一个 接收XML并转换成所需要的Object类的 小例子,希望能够对做互联网数据传输、接口调用的朋友有所帮助。

首先要导入jar包xstream-1.4.3-sources.jar 和 xmlpull-1.1.3.1.jar 两个包;

其次是预备一个 XML 事例

[html] view plain copy

config

span style="white-space:pre" /spanclient type="8888" osversion="9999" version="123" oemtag="5555" area="areacode"/

span style="white-space:pre" /spanprotocol1.10/protocol

span style="white-space:pre" /spansign value="asdfasdf"/

span style="white-space:pre" /spanvientiance version="version"/

/config

其次 就是 按照 XML节点的顺序 从外 到内 编写 java PO类,此实例的目的是将上面的XML转换为 AllnewstateRQ 这个实体类,然后从里面打印出测试数据。

下面依次是 config节点 对应的 AllnewstateRQ类 ; client 节点 对应的 Client 类;sign 节点对应的 Sign类;vientiance 节点 对应的 Vientiance类。

[java] view plain copy

package com.wgq.test09_xml;

import com.thoughtworks.xstream.annotations.XStreamAlias;

@XStreamAlias("config")

public class AllnewstateRQ {

//当节点下有独立属性的时候,需要创建一个独立的类用来保存节点内的属性

private Client client = new Client();

private Sign sign = new Sign();

private Vientiance vientiance = new Vientiance();

//当节点下没有属性,直接由StringValue的时候可直接创建String类型属性

private String protocol;

public Client getClient() {

return client;

}

public void setClient(Client client) {

this.client = client;

}

public Sign getSign() {

return sign;

}

public void setSign(Sign sign) {

this.sign = sign;

}

public Vientiance getVientiance() {

return vientiance;

}

public void setVientiance(Vientiance vientiance) {

this.vientiance = vientiance;

}

public String getProtocol() {

return protocol;

}

public void setProtocol(String protocol) {

this.protocol = protocol;

}

}

[java] view plain copy

package com.wgq.test09_xml;

import com.thoughtworks.xstream.annotations.XStreamAlias;

import com.thoughtworks.xstream.annotations.XStreamAsAttribute;

@XStreamAlias("client")

public class Client {

@XStreamAsAttribute //对属性值进行注解

private String type;//此时类中的属性名要和xml内的属性名相对应

@XStreamAsAttribute

private String osversion;

@XStreamAsAttribute

private String version;

@XStreamAsAttribute

private String oemtag;

@XStreamAsAttribute

private String area;

public String getType() {

return type;

}

public void setType(String type) {

this.type = type;

}

public String getOsversion() {

return osversion;

}

public void setOsversion(String osversion) {

this.osversion = osversion;

}

public String getVersion() {

return version;

}

public void setVersion(String version) {

this.version = version;

}

public String getOemtag() {

return oemtag;

}

public void setOemtag(String oemtag) {

this.oemtag = oemtag;

}

public String getArea() {

return area;

}

public void setArea(String area) {

this.area = area;

}

}

[java] view plain copy

package com.wgq.test09_xml;

import com.thoughtworks.xstream.annotations.XStreamAlias;

import com.thoughtworks.xstream.annotations.XStreamAsAttribute;

@XStreamAlias("sign") //此处要对应节点的名称

public class Sign {

@XStreamAsAttribute

private String value;//此处对应节点内属性名称

public String getValue() {

return value;

}

public void setValue(String value) {

this.value = value;

}

}

[java] view plain copy

package com.wgq.test09_xml;

import com.thoughtworks.xstream.annotations.XStreamAlias;

import com.thoughtworks.xstream.annotations.XStreamAsAttribute;

@XStreamAlias("vientiance")

public class Vientiance {

@XStreamAsAttribute

private String version;

public String getVersion() {

return version;

}

public void setVersion(String version) {

this.version = version;

}

}

测试main方法

[java] view plain copy

package com.wgq.test09_xml;

import com.thoughtworks.xstream.XStream;

import com.thoughtworks.xstream.io.xml.DomDriver;

public class TestStream {

public static void main(String[] args) {

String reqXml = getXml();

XStream xs = new XStream(new DomDriver());

xs.processAnnotations(new Class[]{AllnewstateRQ.class,Client.class,Sign.class,Vientiance.class});

Object obj = xs.fromXML(reqXml);

AllnewstateRQ allnewstateRQ = (AllnewstateRQ) obj;

System.out.println(allnewstateRQ.getProtocol());

System.out.println(allnewstateRQ.getClient().getArea());

System.out.println(reqXml);

}

static String getXml(){

StringBuilder str = new StringBuilder();

str.append("")

.append("config")

.append("client type=\"8888\" osversion=\"9999\" version=\"123\" oemtag=\"5555\" area=\"areacode\" /")

.append("protocol1.10/protocol")

.append("sign value=\"asdfasdf\" /")

.append("vientiance version=\"version\" /")

.append("/config")

;

return str.toString();

}

}

输出结果:

[java] view plain copy

1.10

areacode

configclient type="8888" osversion="9999" version="123" oemtag="5555" area="areacode" /protocol1.10/protocolsign value="asdfasdf" /vientiance version="version" //config

xstream xml转化成java对象

注意事项:

创建接收转换的实体类 里面字段 与 xml节点一一对应。spring 使用 @XStreamAlias("节点") 进行关联。属性名与节点一一对应是很重要的!!!不然 不能正常转换。使用了注解以后,xml节点跟类的属性名不再有关系,但是 注解里面使用的名字就默认是与xml节点对应的。所以保持@XStreamAlias("节点")  里面节点的值与xml 一一对应。

xstream.processAnnotations(需要转化的实体类.class);

实体类 例子:

package com.cmsz.cmup.alipay.model.responses;

import java.util.List;

import com.thoughtworks.xstream.annotations.XStreamAlias;

import com.thoughtworks.xstream.annotations.XStreamAsAttribute;

import com.thoughtworks.xstream.annotations.XStreamConverter;

import com.thoughtworks.xstream.annotations.XStreamImplicit;

import com.thoughtworks.xstream.converters.extended.ToAttributedValueConverter;

/**

* @Title: AccountResultVO.java

* @Package com.cmsz.cmup.alipay.vo.result

* @Description: alipay返回xml字符串封装对象

* @author yekun

* @date 2015年12月4日 上午10:50:23

*/

@XStreamAlias("alipay")

public class AccountResponseModel {

/** 错误信息 */

@XStreamAlias("error")

private String error;

/** 请求是否成功 */

@XStreamAlias("is_success")

private String isSuccess;

/** 请求参数 */

@XStreamAlias("request")

private Request request;

/** xml节点 */

@XStreamAlias("response")

private Response response;

/** 签名 */

@XStreamAlias("sign")

private String sign;

/** 签名加密方式 */

@XStreamAlias("sign_type")

private String sign_type;

//转换代码

XStream xstream = new XStream(new DomDriver());

xstream.processAnnotations(实体类.class);

xstream.fromXML(xmlStr);//xml格式的字符串

xstream如何将java对象转化成有cdata的xml

实体类要加注解

实体类要加注解

@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, ClassT 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;

    }

}

Java-XStream

只需要隐式调用即可,不需要把集合名称写成节点名称。

 xStream.alias("patientRole", PatientRole.class);

 xStream.alias("id", RootExtension.class);

 xStream.addImplicitCollection(PatientRole.class, "ids");

 

 //这是XML文件,patientRole 标签有有两个id节点,名字一样,所以要用集合

 patientRole classCode="PAT"

!--患者健康档案号--

id root="2.16.156.10011.1.2" extension="@患者健康档案号N17"/

!--患者健康卡号--

id root="2.16.156.10011.1.19" extension="@患者健康卡号 同身份证号AN..18"/

!--患者家庭地址--

addr use="H"

houseNumber@地址-房屋号码/houseNumber

streetName@地址-街道/streetName

township@地址-镇/township

county@地址-区/county

city@地址-市/city

state@地址-省/state

postalCode@邮政编码/postalCode

/addr

!--患者电话--

telecom value="@患者电话"/

/patientRole

//下面是patientRole节点对象中定义的属性

private String classCode;

private ListRootExtension ids = new ArrayListRootExtension();

private Address addr = new Address();

private Value telecom = new Value();

解析出来没问题,有什么不懂的可以再问我

关于xstreamjava和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

The End

发布于:2022-12-15,除非注明,否则均为首码项目网原创文章,转载请注明出处。