XStreamAlias 可以把objec和xml相互转换,但是有时候节点带有属性和值就需要特殊处理下:


<?xml version="1.0" encoding="UTF-8"?>
<student>
<studentList>
<student_Message sid="1">
<id>1</id>
<idType name="身份证">1</idType>
<idNo>1</idNo>
<name>张三</name>
<gender name="男">1</gender>
</student_Message>
<student_Message id="2">
<id>2</id>
<idType name="护照">2</idType>
<idNo>2</idNo>
<name>李华</name>
<gender name="女">2</gender>
</student_Message>
</studentList>
</student>

有时候需要生成或是解析上面这种XML。就需要用到XStream的其他属性

pom:需要使用到  xstream-1.4.8.jar

<dependency>
  <groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.8</version>
</dependency>

创建实体类


import com.thoughtworks.xstream.annotations.XStreamAlias;
import java.util.List;
/**
* @author ceshi
* @Title: StudentList
* @ProjectName StudentList
* @Description: TODO
* @date 2018/7/1122:00
*/
//定义最外节点属性
@XStreamAlias("student")
public class StudentList {
//根据XML生成student集合
private List<Student> studentList;
public List<Student> getStudentList() {
return studentList;
} public void setStudentList(List<Student> studentList) {
this.studentList = studentList;
}
}
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute; /**
* @author ceshi
* @Title: Student
* @ProjectName ceshi
* @Description: TODO
* @date 2018/7/1121:54
*/
//定义内部节点
@XStreamAlias("student_Message")
public class Student {
//定义<student_Message sid="1">属性
@XStreamAsAttribute()
private String sid;
private String id;
private IdType idType;
private String idNo;
private String name;
private Gender gender; public String getSid() {
return sid;
} public void setSid(String sid) {
this.sid = sid;
} public String getId() {
return id;
} public void setId(String id) {
this.id = id;
} public IdType getIdType() {
return idType;
} public void setIdType(IdType idType) {
this.idType = idType;
} public String getIdNo() {
return idNo;
} public void setIdNo(String idNo) {
this.idNo = idNo;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Gender getGender() {
return gender;
} public void setGender(Gender gender) {
this.gender = gender;
}
}
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import com.thoughtworks.xstream.annotations.XStreamConverter;
import com.thoughtworks.xstream.converters.extended.ToAttributedValueConverter; /**
* @author ceshi
* @Title: IdType
* @ProjectName ceshi
* @Description: TODO
* @date 2018/7/1121:56
*/
@XStreamAlias("MaxBenefitDurPeriod")
@XStreamConverter(value = ToAttributedValueConverter.class, strings = { "value" })
public class IdType {
//// 将name作为Cat属性输出在父节点
@XStreamAsAttribute()
private String name;
private String value; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getValue() {
return value;
} public void setValue(String value) {
this.value = value;
}
}
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import com.thoughtworks.xstream.annotations.XStreamConverter;
import com.thoughtworks.xstream.converters.extended.ToAttributedValueConverter; /**
* @author ceshi
* @Title: Gender
* @ProjectName ceshi
* @Description: TODO
* @date 2018/7/1121:58
*/
@XStreamAlias("MaxBenefitDurPeriod")
@XStreamConverter(value = ToAttributedValueConverter.class, strings = { "value" })
public class Gender {
@XStreamAsAttribute()
private String name;
private String value; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getValue() {
return value;
} public void setValue(String value) {
this.value = value;
}
}

工具类


import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver; /**
* @author ceshi
* @Title: XStreamUtils
* @ProjectName ceshi
* @Description: TODO
* @date 2018/7/1122:10
*/
public class XStreamUtils{
/**
* 将Object转换为xml
* @param obj 转换的bean
* @return bean转换为xml
*/
public static String objectToXml(Object obj) {
XStream xStream = new XStream();
//xstream使用注解转换
xStream.processAnnotations(obj.getClass());
return xStream.toXML(obj);
} /**
* 将xml转换为T
* @param <T> 泛型
* @param xml 要转换为T的xml
* @param cls T对应的Class
* @return xml转换为T
*/
public static <T> T xmlToObject(String xml, Class<T> cls){
XStream xstream = new XStream(new DomDriver());
//xstream使用注解转换
xstream.processAnnotations(cls);
return (T) xstream.fromXML(xml);
}
}

测试类


import org.junit.Test;
import java.util.ArrayList;
import java.util.List; /**
* @author ceshi
* @Title: ceshi
* @ProjectName ceshi
* @Description: ceshiXStreamAlias
* @date 2018/7/1121:53
*/
public class JunitXStreamAlias {
@Test
public void test(){
StudentList studentList = new StudentList();
List<Student> list = new ArrayList<Student>();
Student s = new Student();
IdType i = new IdType();
Gender g = new Gender();
s.setSid("1");
s.setId("1");
i.setName("身份证");
i.setValue("1");
s.setIdType(i);
s.setIdNo("1");
s.setName("张三");
g.setName("男");
g.setValue("1");
s.setGender(g);
list.add(s);
Student s1 = new Student();
IdType i1 = new IdType();
Gender g1 = new Gender();
s1.setSid("2");
s1.setId("2");
i1.setName("护照");
i1.setValue("2");
s1.setIdType(i1);
s1.setIdNo("2");
s1.setName("李华");
g1.setName("女");
g1.setValue("2");
s1.setGender(g1);
list.add(s1);
studentList.setStudentList(list);
String xml = XStreamUtils.objectToXml(studentList);
xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"+xml;
xml = xml.replaceAll("__","_");
System.out.println(xml);
     StudentList ss = XStreamUtils.xmlToObject(xml,StudentList.class);
     System.out.println(JSON.toJSON(ss));
  } }

结果:


XStream使用总结:


  XStreamAsAttribute 作用是将类内成员作为父节点属性输出,等同于xstream.useAttributeFor(Student.class, "sid")  
  XStreamAlias("cat") 等同于 xstream.alias("student_Message", Student.class);

  XStreamConverter xstreamConvert用于指定class及Field的converter(转换方式)。

  XStreamImplicit 注解使用当需要将collection或map类型的成员变量中数据转换成xml相同层次的元素时,可以在该成员变量使用该注解,会将添加注释的节点去掉 @XStreamImplicit(itemFieldName="studentList")

Java -- XStreamAlias 处理节点中的属性和值的更多相关文章

  1. 学习旧岛小程序 (5) observer 函数中修改属性的值

    不要在一个属性的 observer  函数中修改属性的值 不然会造成内存泄露 错误代码: properties: { /* 期刊号 */ index: { type: String, observer ...

  2. Java使用PropertyDescriptor获取实体类中私有属性的值,并给私有属性赋值

    大家都知道Java类中的私有的(private)属性是获取不到的(即使使用继承依然获取不到),那如果非要获取私有属性的值怎么办呢?一般的做法是将该java类封装称为一个JavaBean,即封装该私有属 ...

  3. java获取properties配置文件中某个属性最简单方法

    假如我想获取src目录下sysConfig.properties中的uploadpath属性的值 方法如下所示: private static final ResourceBundle bundle ...

  4. C#反射遍历/查询类中的属性以及值

    遍历一个类/或类对象的属性/值,很有用,看个例子 using System; using System.Collections.Generic; using System.Linq; using Sy ...

  5. 从Object对象中读取属性的值

    C#是强类型语言,强到多变态?一个对象没有定义某个属性,你想点出来,IDE直接给你报语法错误.远不如js那么自由,想怎么点怎么点. 如果你从别人接口中拿到的就是Object类型,你想获取某个属性的值怎 ...

  6. Vue2自定义指令改变DOM值后未刷新data中绑定属性的值

    标签(空格分隔): Vue 自定义指令用于过滤输入框,只允许输入数字: Vue.directive('numberOnly', { bind: function (el, binding) { el. ...

  7. 微信小程序:给data中对象中的属性设置值与给data中的属性或对象或数组设置值的区别

    一.给data中的属性或对象或数组设置值,属性名不需要加引号 this.setData({ material: param, // 这里material为对象 } this.setData({   d ...

  8. 【JAVA】调用类中的属性

    class person { String name; int age; String like; void setName(String name) { this.name = name; } vo ...

  9. Java 正则表达式提取标签中的属性(src 连接地址)等

    public class Test { public static void main(String[] args) { String source = "<p><img ...

随机推荐

  1. VBA消息框

    MsgBox函数显示一个消息框,并等待用户点击一个按钮,然后根据用户点击该按钮的动作执行. 语法 MsgBox(prompt[,buttons][,title][,helpfile,context]) ...

  2. wpf UI 元素类型

  3. React Native Android打包apk

    按照官方的5步曲: 1.在终端里面,cd 到项目的根目录后.执行下面这行命令: keytool -genkey -v -keystore my-release-key.keystore -alias ...

  4. 【转】spring boot mybatis 读取配置文件

    spring boot mybatis 配置整理 一.加载mybatis的配置 1.手写配置,写死在代码里 import java.io.IOException; import java.util.P ...

  5. python -django 之第三方支付

    神魔是第三方支付: 第三方支付是指具有一定实力和信誉保障的第三方独立机构.通过与各大银行签订合同,建立连接用户和银行支付结算系统的平台,从而实现电子支付模式.从另一个角度来看,第三方支付就是非金融机构 ...

  6. 2018.4.27 java容器

    一.容器的概念 在Java当中,如果有一个类专门用来存放其它类的对象,这个类就叫做容器,或者就叫做集合,集合就是将若干性质相同或相近的类对象组合在一起而形成的一个整体 二.容器与数组的关系 之所以需要 ...

  7. 1.golang的环境搭建及入门

    安装包下载 下载链接:https://dl.google.com/go/go1.12.3.windows-amd64.msi 环境搭建 安装完成之后,找一个来存放go语言文件的文件夹,我这里选的是G: ...

  8. python 的 format 函数

    python的格式化字符串方法之一------------format 函数 它通过{}和:来代替%. 数字 格式 输出 描述 3.1415926 {:.2f} 3.14 保留小数点后两位 3.141 ...

  9. vue学习笔记——路由

    1 路由配置 在vue.config中配置,则在代码中可以使用 @来表示src目录下 import aa from '@/aa/index.js' 2 单页面可以懒加载 3 创建动态路由 路由中定义: ...

  10. 创建一个dynamics 365 CRM online plugin (二) - fields检查

    Golden Rules 1. Platform only passes Entity attributes to Plugin that has change of data. 2. If the ...