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. Linux过滤错误日志

    grep -E 'at |Exception|exception|Error|error|Caused by' test.log

  2. spring boot Tomcat文件上传找不到零时文件夹

    springboot项目上传文件是找不到零时文件夹 1.本身启动jar包时内置Tomcat没有创建零时文件夹 2.在zuul网关级别没有创建零时文件夹 处理方案: -Djava.io.tmpdir=/ ...

  3. Django安装遇到的问题

    因为mac一般自带的有python解释器,如果重新安装了新的解释器,并且想默认使用的话,需要配置一下环境变量. 在使用python解释器的时候,可以用命令:which python 来确定当前使用的时 ...

  4. 2017年4月7日16:18:17 java8 常用记录

    List<String> customerUids = customerTagModel.stream().map(CustomerTagModel::getCustomerUid)   ...

  5. Java学习笔记35(sql补充)

    在上一篇里,写了数据库的增删该查,没有写完,这里补充 CREATE DATABASE Zs_Base; USE Zs_Base; # 创建表 CREATE TABLE PRODUCT( ID INT ...

  6. 2--Postman脚本介绍

    Postman是访问各种API的客户端.它的强大之处在于其允许在对某一个request访问的之前和之后分别运行自定义的一段Javascript脚本,可以将数条request连结成一个流程完成一体化测试 ...

  7. Selenium·自动化框架集成

    date:2018513 day08aft 一.自动化框架集成分层 1.config 配置(项目配置——测试环境,公司环境,线上环境:以中国人才热线登陆为例,网址.用户名.密码等) 2.public ...

  8. 【转载】 强化学习(十一) Prioritized Replay DQN

    原文地址: https://www.cnblogs.com/pinard/p/9797695.html ------------------------------------------------ ...

  9. System.IO.FileSystemWatcher

    这个类功能很强.可以实时监测文件系统的变化. https://msdn.microsoft.com/zh-cn/library/system.io.filesystemwatcher.aspx 事件 ...

  10. Coprime Sequence (HDU 6025)前缀和与后缀和的应用

    题意:给出一串数列,这串数列的gcd为1,要求取出一个数使取出后的数列gcd最大. 题解:可以通过对数列进行预处理,求出从下标为1开始的数对于前面的数的gcd(数组从下标0开始),称为前缀gcd,再以 ...