目 录CONTENT

文章目录

XML— 数据传输方式

在水一方
2022-05-22 / 0 评论 / 0 点赞 / 1,356 阅读 / 3,700 字 / 正在检测是否收录...

前言

实际业务中通常需要调用第三方提供的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>

浏览器打开的效果
image.png

xml语法

1 必须要有根节点(一般用root)
2 xml头声明不强制,可有可无,建议加上
3 所有xml都必须是成对标签
4 标签名大小写敏感(区分大小写)
5 标签不能交叉
6 特殊字符需要转义,在xml中需要转义的字符有
image.png

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框架

0

评论区