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. LeetCode 60 第K个排列

    题目: 给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列. 按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下: "123" "13 ...

  2. 使用GraphHttpClient调用Microsoft Graph接口 - GET

    博客地址:http://blog.csdn.net/FoxDave 使用GraphHttpClient类调用Microsoft Graph REST API,你可以使用GET,POST和PATCH请求 ...

  3. .NET并行计算和并发7-Task异步

    使用任务并行库执行异步任务 下面的示例演示如何通过调用 TaskFactory.StartNew 方法来创建并使用 Task 对象. using System; using System.Thread ...

  4. cat语法

    语法格式 cat [-AbeEnstTuv] [--help] [--version] fileName 参数说明: -n 或 --number:由 1 开始对所有输出的行数编号. -b 或 --nu ...

  5. mysql中外键的创建与删除

    外键的创建 方法1:创建表的时候设置(外键名随机生成) 1.前提条件,必须要有一个主表,这里设为persons 2.主表中必须设置主键字段primary key,这里设为id_p //创建数据库dat ...

  6. 判断是不是微信浏览器和QQ内置浏览器

    is_weixn() { let ua = navigator.userAgent.toLowerCase(); if (ua.match(/MicroMessenger/i) == "mi ...

  7. Object.create(null)、Object.create({})、{} 三者创建对象的区别

    参考 1.先看看我们经常使用的{}创建的对象是什么样子的: var o = {a:1}; console.log(o) 从上图可以看到,新创建的对象继承了Object自身的方法,如hasOwnProp ...

  8. 前台的url通过 ActionName?var1=xx&var2=yy 的形式传给特定action

    本文对自己开发的基于lucene和J2EE技术的搜索引擎开发经验进行简单总结.今后可能会从性能的角度总结lucene开发经验.当数据上TB级别后,分布式lucene以及结合分布式文件系统(如HDFS) ...

  9. jQuery-2.DOM---jQuery遍历

    jQuery遍历之children()方法 jQuery是一个合集对象,如果想快速查找合集里面的第一级子元素,此时可以用children()方法.这里需要注意:.children(selector) ...

  10. indexOf()定义和用法

    indexOf()定义和用法 indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置. 语法 stringObject.indexOf(searchvalue,fromindex) ...