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. 表单验证,添加动态class

  2. SQL-47 如何获取emp_v和employees有相同的数据?

    题目描述 存在如下的视图:create view emp_v as select * from employees where emp_no >10005;如何获取emp_v和employees ...

  3. 数组的高级API-sort

    按升降序排列数组项.本身存在的问题:只能通过第一位排列.解决方法:通过回调函数进行规制设置. a - b 升序. b - a 降续. 其内部运用了冒泡排序 <!DOCTYPE html> ...

  4. Oracle启动和归档模式

    数据库运行 Oracle数据库的完整启动过程是分步骤完成的,包含以下3个步骤: 启动实例–>加载数据库–>打开数据库 因为Oracle数据库启动过程中不同的阶段可以对数据库进行不同的维护操 ...

  5. L333 Should You Listen to Music While You Work?

    Should You Listen to Music While You Work? "Whistle while you work" is classic advice, str ...

  6. oh_my_zsh

    oh_my_zsh  zsh默认已经安装   cat /etc/shells   查看安装没有   (https://xiaozhou.net/learn-the-command-line-iterm ...

  7. ASP.NET中出现内存溢出错误System.OutOfMemoryException

    原因1:数据库服务器性能问题导致内存不够用,从而引起内存溢出 原因2:在IIS的应用程序池中进行配置,引起IIS服务器的内存分配问题,从而引起内存溢出   分析:      32位操作系统的寻址空间是 ...

  8. php连接redis服务

    $redis = new Redis(); $redis->connect('127.0.0.1', 6379);//可以执行redis操作了.....  

  9. 《Linux内核原理与分析》第九周作业

    课本:第八章 进程的切换和系统的一般执行过程 进行进程调度的时机 Linux内核通过schedule函数实现进程调度,schedule函数在运行队列中找到一个进程,把CPU分配给它 调用schedul ...

  10. springboot2.1.3.RELEASE+jsp笔记war部署tomcat

    springboot+jsp <packaging>war</packaging> <parent> <groupId>org.springframew ...