前言
实际业务中通常需要调用第三方提供的api来获取数据,比如很多门户网站的天气预报信息等,很多的服务端提供的接口的返回格式有json和xml,而如果是通过webservice的方式来进行远程调用,这个格式往往是xml的形式。
web传输的主要两种数据格式:JSON与XML,对于API,有很多种方式进行数据的传输,实际开发中一般数据都是通过json来进行传输,本小节主要对xm这个数据传输的格式内容来做一个梳理
SOAP
它的全称叫作简单对象访问协议,它是最早人们用来进行数据传输的通讯协议,它通过xml定义了服务调用的参数和类型,定义了正文格式,定义了响应方式, 它可以通过http协议进行传输,也可以通过smtp协议或者tcp协议进行传输,因为xml的冗长,在消息过多的时候,它的传输数据会大大增加
关于xml
XML 全称是可扩展标记语言(EXtensible Markup Language),是一种类似与HTML的语言,是被设计用来描述数据的语言,🔥主要就是用来进行传输和存储数据
💡常见的作用还有就是充当配置文件
作用
规范了数据格式,使数据具有结构性,易读易处理
特点
xml的标签必须自己定义,但是标签名一定要有含义
demo
创建一个xml文件,然后输入下方内容
<root>
<user>zhangsan</user>
<message>success</message>
</root>
浏览器打开的效果
xml语法
1 必须要有根节点(一般用root)
2 xml头声明不强制,可有可无,建议加上
3 所有xml都必须是成对标签
4 标签名大小写敏感(区分大小写)
5 标签不能交叉
6 特殊字符需要转义,在xml中需要转义的字符有
XML解析方式
DOM和SAX(这个部分也是需要重点进行了解)
如何将xml转化成转成bean
XStream是一个Java对象与XML互相转换的工具类库
🔥🔥具体过程
- 导入jar包
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.19</version>
</dependency>
创建bean
@Data
public class User {
private String userName;
private String email;
public User() {}
public User(String userName, String email) {
this.userName = userName;
this.email = email;
}
}
Java对象转XML:
使用xStream.toXML()方法
public static void main(String[] args) {
User user = new User("lanweihong", "lwhhhp@gmail.com");
//创建解析XML对象
XStream xStream = new XStream();
//设置别名, 默认会输出全路径
xStream.alias("User", User.class);
//转为xml
String xml = xStream.toXML(user);
System.out.println(xml);
}
转换后的文本为:
<User>
<userName>lanweihong</userName>
<email>lwhhhp@gmail.com</email>
</User>
XML转Java对象:
使用xStream.fromXML()方法
demo:
public static void main(String[] args) {
XStream xStream = new XStream();
xStream.alias("User", User.class);
String xml = "<User>\n" +
" <userName>lanweihong</userName>\n" +
" <email>lwhhhp@gmail.com</email>\n" +
"</User>";
//转对象
User user = (User)xStream.fromXML(xml);
System.out.println(user.toString());
}
输出的内容为:
User:{userName=lanweihong,email=lwhhhp@gmail.com}
二、通过注解
最基本的注解@XStreamAlias用于设置字段别名;我们将上述例子创建的User对象添加注解改造一下
@XStreamAlias("user")
public class User {
@XStreamAlias("username")
private String userName;
@XStreamAlias("email")
private String email;
public User() {}
public User(String userName, String email) {
this.userName = userName;
this.email = email;
}
public String toString() {
return "User:{userName=" + this.userName + ",email=" + this.email + "}";
}
//Getter and Setter...
}
XStream默认不会读取这个注解,因为,我们需要声明XStream的注解来源:
public static void main(String[] args) {
User user = new User("lanweihong", "lwhhhp@gmail.com");
XStream xStream = new XStream();
//声明XStream注解来源
xStream.processAnnotations(User.class);
String xml = xStream.toXML(user);
System.out.println(xml);
}
输出的文本为:
<user>
<username>lanweihong</username>
<email>lwhhhp@gmail.com</email>
</user>
由此可见,生成的xml节点名称已经变为我们使用@XStreamAlias注解的别名
简单封装为工具类
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
public class XmlUtils {
/**
* XML转对象
* @param clazz 对象类
* @param str xml字符串
* @param <T> T
* @return
*/
public static <T> T parseFromXml(Class<T> clazz, String xml) {
//创建解析XML对象
XStream xStream = new XStream(new DomDriver());
//处理注解
xStream.processAnnotations(clazz);
@SuppressWarnings("unchecked")
//将XML字符串转为bean对象
T t = (T)xStream.fromXML(xml);
return t;
}
/**
* 对象转xml
* @param obj 对象
* @return
*/
public static String toXml(Object obj) {
XStream xStream = new XStream(new DomDriver());
xStream.processAnnotations(obj.getClass());
return xStream.toXML(obj);
}
}
扩展
关于hutool中对于xml的操作工具类地址:
https://www.hutool.cn/docs/#/core/%E5%B7%A5%E5%85%B7%E7%B1%BB/XML%E5%B7%A5%E5%85%B7-XmlUtil
XmlUtil只是w3c dom的简单工具化封装,减少操作dom的难度,如果项目对XML依赖较大,依旧推荐Dom4j框架
评论区