xstreamjava的简单介绍
今天给各位分享xstreamjava的知识,其中也会对进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
- 1、java程序中使用xstream方法将实体类转成xml,实体类中有null值,生成的xml就去除了含有null值的节点!
- 2、xstream xml转化成java对象
- 3、xstream如何将java对象转化成有cdata的xml
- 4、Java-XStream
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和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
发布于:2022-12-15,除非注明,否则均为
原创文章,转载请注明出处。