XML— 数据传输方式

前言实际业务中通常需要调用第三方提供的api来获取数据,比如很多门户网站的天气预报信息等,很多的服务端提供的接口的返回格式有json和xml,而如果是通过webservice的方式来进行远程调用,这个格式往往是xml的形式。

web传输的主要两种数据格式:JSON与XML,对于API,有很多种方式进行数据的传输,实际开发中一般数据都是通过json来进行传输,本小节主要对xm这个数据传输的格式内容来做一个梳理

SOAP

它的全称叫作简单对象访问协议,它是最早人们用来进行数据传输的通讯协议,它通过xml定义了服务调用的参数和类型,定义了正文格式,定义了响应方式, 它可以通过http协议进行传输,也可以通过smtp协议或者tcp协议进行传输,因为xml的冗长,在消息过多的时候,它的传输数据会大大增加

关于xmlXML 全称是可扩展标记语言(EXtensible Markup Language),是一种类似与HTML的语言,是被设计用来描述数据的语言,🔥主要就是用来进行传输和存储数据

💡常见的作用还有就是充当配置文件

作用规范了数据格式,使数据具有结构性,易读易处理

特点xml的标签必须自己定义,但是标签名一定要有含义

demo创建一个xml文件,然后输入下方内容

代码语言:javascript复制

zhangsan

success

浏览器打开的效果

xml语法1 必须要有根节点(一般用root)

2 xml头声明不强制,可有可无,建议加上

3 所有xml都必须是成对标签

4 标签名大小写敏感(区分大小写)

5 标签不能交叉

6 特殊字符需要转义,在xml中需要转义的字符有

XML解析方式DOM和SAX(这个部分也是需要重点进行了解)

如何将xml转化成转成beanXStream是一个Java对象与XML互相转换的工具类库

🔥🔥具体过程导入jar包代码语言:javascript复制

com.thoughtworks.xstream

xstream

1.4.19

创建bean

代码语言:javascript复制@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()方法

代码语言:javascript复制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);

}转换后的文本为:

代码语言:javascript复制

lanweihong

lwhhhp@gmail.com

XML转Java对象:

使用xStream.fromXML()方法

demo:

代码语言:javascript复制public static void main(String[] args) {

XStream xStream = new XStream();

xStream.alias("User", User.class);

String xml = "\n" +

" lanweihong\n" +

" lwhhhp@gmail.com\n" +

"";

//转对象

User user = (User)xStream.fromXML(xml);

System.out.println(user.toString());

}输出的内容为:

代码语言:javascript复制User:{userName=lanweihong,email=lwhhhp@gmail.com}二、通过注解

最基本的注解@XStreamAlias用于设置字段别名;我们将上述例子创建的User对象添加注解改造一下

代码语言:javascript复制@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的注解来源:

代码语言:javascript复制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);

}输出的文本为:

代码语言:javascript复制

lanweihong

lwhhhp@gmail.com

由此可见,生成的xml节点名称已经变为我们使用@XStreamAlias注解的别名

简单封装为工具类代码语言:javascript复制import com.thoughtworks.xstream.XStream;

import com.thoughtworks.xstream.io.xml.DomDriver;

public class XmlUtils {

/**

* XML转对象

* @param clazz 对象类

* @param str xml字符串

* @param T

* @return

*/

public static T parseFromXml(Class 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框架