java关于对象(javabean)与xml之间的相互转换今天我们要探讨的⼀个问题是,如何将xml格式的字符串转换成对象,以及对象转换成xml字符串。
简介
现如今,虽然数据的传输⼤部分都是⽤json格式来进⾏传输,但是xml毕竟也会有⼀些⽼的项⽬在进⾏使⽤,⾝为⼀个万能的程序员。我们⼜怎能不会使⽤它呢?正常的⽼式⽅法是通过获取节点来进⾏⼀系列操作,个⼈感觉太过于复杂、繁琐。今天推荐⼀套简单的api。XStream类。好了废话不多说,直接上代码。(为了讲述的更加清晰。我们全程不使⽤任何注解,只调⽤api来达到效果。在理解了原理的情况下看下注解的语法即会使⽤)
对象转xml
⾸先我们从简单的对象转xml为例来进⾏讲解,因为xml转对象会相对复杂,我们由浅到深。
第⼀步:导⼊jar包,本⼈项⽬以gradle搭建。jar包下载引⽤如下(普通项⽬从⽹上⼀下jar包放到lib⽂件夹下即可) compile(“com.thoughtworks.xstream:xstream:1.4.10”)
第⼆步:创建对象(创建User与Customer,不要被名字误导。。。没什么关系)
1.创建User对象(使⽤lombok创建getset⽅法,不了解的同学直接⼿动创建即可)
package com.kingboy.springboot.domain.dto;
import lombok.Data;
import java.util.List;
/**
* Created by beyondLi on 2017/6/14.
*/
@Data
public class User {
private String name;
private Integer age;
private List<Customer> customer;
}
2.创建Customer对象(同上)
package com.kingboy.springboot.domain.dto;
import lombok.Data;
/**
* Created by beyondLi on 2017/6/14.
*/
@Data
public class Customer {
private String commodity;
}
第三步:测试类
//创建user对象与customer对象并赋值
User user = new User();
Customer customer1 = new Customer();
Customer customer2 = new Customer();
customer1.setCommodity("商品1");
customer2.setCommodity("商品2");
List<Customer> list = new ArrayList<>();
list.add(customer1);
list.add(customer2);
user.setName("beyondLi");
user.setAge(23);
user.setCustomer(list);
//创建xStream对象
XStream xStream = new XStream();
//调⽤toXML 将对象转成字符串
String s = XML(user);
System.out.println(s);
第四步:输出结果
java xml是什么
第五步:优化
上述我们看到了结果,但是貌似和我们想要的不太⼀样呀,怎么有些是全路径名称呢?这⾥解决⽅法很简单。主要讲思路。因为关系到xml转对象时候封装是否报错的问题。默认情况下当对象没有名字的时候,例如最⼀开始的对象 以及对象中的集合类型中泛型的类型,这些我们都没办法给他起名字的,默认情况下它是全路径名称。所以如果我们不处理,当xml转对象的时候传来的xml直接都是名字,⽽我们如果直接调⽤api封装就会出现因为名字不⼀致所以封装失败⽽报错的问题。所以我们要给全路径名称的类起别名(注!最好不要⽆脑性的给所有对象都起别名,虽然也可以解决问题。但是我们最好理解透彻,只给有需要的类起别名),代码如下
//创建user对象与customer对象并赋值
User user = new User();
Customer customer1 = new Customer();
Customer customer2 = new Customer();
customer1.setCommodity("商品1");
customer2.setCommodity("商品2");
List<Customer> list = new ArrayList<>();
list.add(customer1);
list.add(customer2);
user.setName("beyondLi");
user.setAge(23);
user.setCustomer(list);
//创建xStream对象
XStream xStream = new XStream();
//给指定类起别名
xStream.alias("User",User.class);
xStream.alias("Customer",Customer.class);
/
/调⽤toXML 将对象转成字符串
String s = XML(user);
System.out.println(s);
结果:
希望阅读到这⾥的同学将上⾯那个起别名理解清楚,什么时候起别名,什么时候不需要起别名,这样才能在xml转对象的时候不出现任何的偏差和错误。
XML转对象
第⼀步:导⼊jar包。同上
第⼆步:创建User与Customer对象。同上
第三部 : 测试类
⾸先我们展⽰⼀下上⾯提⽰的不起别名报错问题,我模拟了⼀个xml类型的字符串,但是不起别名
//模拟⼀个xml格式字符串
String xml = "<user>\n" +
"  <name>beyondLi</name>\n" +
"  <age>23</age>\n" +
"  <customer>\n" +
"    <Customer>\n" +
"      <commodity>商品1</commodity>\n" +
"    </Customer>\n" +
"    <Customer>\n" +
"      <commodity>商品2</commodity>\n" +
"    </Customer>\n" +
"  </customer>\n" +
"</user>";
//创建xStream对象
XStream xstream = new XStream();
//起别名,先不写,让其报错
User user2 = (User) xstream.fromXML(xml);
System.out.println(user2);
结果
和明显,虽然我们对象user和customer起名字都没有错误。但是报错说不到。这个报错结合上⾯的对象转xml的结果。我们就可以明显的看出问题出在了哪⾥。
正确代码如下
//模拟⼀个xml格式字符串
String xml = "<user>\n" +
"  <name>beyondLi</name>\n" +
"  <age>23</age>\n" +
"  <customer>\n" +
"    <Customer>\n" +
"      <commodity>商品1</commodity>\n" +
"    </Customer>\n" +
"    <Customer>\n" +
"      <commodity>商品2</commodity>\n" +
"    </Customer>\n" +
"  </customer>\n" +
"</user>";
//创建xStream对象
XStream xstream = new XStream();
/
/将别名与xml名字相对应
xstream.alias("user", User.class);
xstream.alias("Customer", Customer.class);
User user2 = (User) xstream.fromXML(xml);
System.out.println(user2);
结果:
转换成功
其实xml与对象之间的相互转换并没有难度,但是经常出错和不成功其实就是因为在别名上的问题。⽽导致⽆法匹配。希望这篇⽂当可以帮助更多的同学解决问题。
以上观点仅是个⼈理解。如有错误或不完善,还望指出,共同成长

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。