XML文件格式讲解、和xml文件的xsd约束和HTTP状态码详细解读

一、XML文件

1.1 xml文件概述

xml文件是一种文本传输格式,也是配置文件的一种形式,一般简单xxx.xml文件,xxx.properties文件,xxx.yml这些文件一般就会想到配置文件上

下面先写一个非常简单的xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<students>
    <student id="01">
        <name>张三</name>
        <age>18</age>
        <gender></gender>
        <address>郑州</address>
    </student>

    <student id="02">
        <name>李四</name>
        <age>19</age>
        <gender></gender>
        <address>北京</address>
    </student>

    <student id="03">
        <name>王五</name>
        <age>20</age>
        <gender></gender>
        <address>西安</address>
    </student>
</students>

开头的<?xml version="1.0" encoding="UTF-8" ?>当中的

xml 代表的是xml文件

version代表的是版本号

encoding代表的是编码集

xml里面的标签除了开头的规则以外,其他的标签都是可以自己定义的。

标签一定有结尾标记

一个xml文件中只允许有一个【根节点】

1.2 xml文件解析方式对比

DOM解析方式

	把整个 XML 文件完整的读取到内存,进行数据解析操作,可以针对于 XML 文件进行【增删改查】操作。会导致文件内存占用过大。常用于 服务器配置,项目配置
	【Spring 全家桶】内置 DOM 解析方式,使用第三方工具 Dom4j.

SAX解析方式

	读取一行 XML 文件内容,解析一行数据,节约内存,但是有且只能完成针对于 XML 文件的【读取解析操作】,可以用于手机端相关软件的配置,APP,通讯录。。。

1.3 代码

在pom.xml文件中导入Dom4j依赖

<dependency>
    <groupId>dom4j</groupId>
    <artifactId>dom4j</artifactId>
    <version>1.1</version>
</dependency>
/**
 * Dom4j 案例代码
 */
@SuppressWarnings("all")
public class Demo1 {
    public static void main(String[] args) throws DocumentException, IOException {
        // 1. 获取对应的文件的输入流对象
        InputStream inputStream = Demo1.class.getClassLoader().getResourceAsStream("student.xml");

        // 2. 创建 DOM 解析核心类
        SAXReader reader = new SAXReader();

        // 3. 通过 SAXReader 实例化对象,根据输入流对象,获取对应 XML 文件的 Document 对象
        Document document = reader.read(inputStream);

        // 4. 【核心步骤】获取根结点对象
        Element rootElement = document.getRootElement();

        /*
        1. 获取第一个子结点
        2. 获取所有的子结点
         */

        // 5. 获取结点名称为 student 的第一个子结点
        Element student = rootElement.element("student");

        System.out.println(student);

        // 6. 可以获取当前结点的[【属性结点】
        String id = student.attributeValue("id");
        System.out.println("id:" + id);

        /*
         7. 获取 Student 结点的所有子节点
                List elements();
                当前方法没有明确声明泛型,可以自行指定为 List<Element>
                同时为了解决代码中的警告,可以使用警告压制 @SuppressWarnings("all")
         */
        List<Element> elements = student.elements();

        for (Element element : elements) {
            List<Element> elements1 = element.elements();
            if (elements1.isEmpty()) {
                // 8. 获取 XML 文件结点的名称和对应的文件数据内容
                System.out.println(element.getName() + ":" + element.getText());
            } else {
                for (Element element1 : elements1) {
                    System.out.println(element1.getName() +  ":" + element1.getText());
                }
            }
        }

        inputStream.close();
    }
}

1.4 XPath

导入相关的jaxen依赖

<!-- https://mvnrepository.com/artifact/jaxen/jaxen -->
<dependency>
    <groupId>jaxen</groupId>
    <artifactId>jaxen</artifactId>
    <version>1.1.6</version>
</dependency>

案例代码

/**
 * Xpath
 */
public class Demo2 {
    public static void main(String[] args) throws DocumentException, IOException {
        // 获取指定 XML 文件输入流对象,同时创建 SAXReader 核心对象,获取 Document 对象
        InputStream input = Demo2.class.getClassLoader().getResourceAsStream("student.xml");
        SAXReader reader = new SAXReader();
        Document document = reader.read(input);

        // 【核心代码】获取根结点元素对象
        Element rootElement = document.getRootElement();

        /*
        XPath 语法
         */
        /*
         1. 获取所有的 name 标签值
         //name ==>
            // 表示忽略层级关系
            name 表示要求获取的 XML 结点名称为 name
         */
        List<Node> nodes = rootElement.selectNodes("//name");
        nodes.forEach(n -> System.out.println(n.getName() + ":" + n.getText()));

        System.out.println();

        // 2. 忽略层级关系,获取 address 结点下的所有子结点
        List<Node> nodes1 = rootElement.selectNodes("//address/*");
        nodes1.forEach(n -> System.out.println(n.getName() + ":" + n.getText()));

        // 3. 忽略层级关系,找到 student 结点,要求 student 结点 有 id 属性,并且 属性值 为 001
        List<Node> nodes2 = rootElement.selectNodes("//student[@id='001']");
        for (Node node : nodes2) {
            Element e = (Element) node;
            System.out.println("id:" + e.attributeValue("id"));
        }

        System.out.println();
        // 4. 忽略层级关系,找到 student 结点 要求当前 Student 结点下标为 1【注意】 XML 文件下标为 1 开始
        List<Node> nodes3 = rootElement.selectNodes("//student[1]");
        nodes3.forEach(n -> {
            Element e = (Element) n;
            System.out.println(e.attributeValue("id"));
        });

        // 4. 忽略层级关系,找到 student 结点 要求当前 Student 结点为最后一个结点
        List<Node> nodes4 = rootElement.selectNodes("//student[last()]");

        nodes4.forEach(n -> {
            Element e = (Element) n;
            System.out.println(e.attributeValue("id"));
        });
        input.close();
    }
}

1.5 XML约束文件

<?xml version="1.0"<?xml version="1.0"?>
<!--
schema申明
xmlns namespace 命名空间声明
xmlns:xsd 使用XMLSchema规范URL
targetNamespace 目标命名空间
elementFormDefault 元素规则默认要求
 -->
<xsd:schema xmlns="http://www.qfedu.com/xml"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="http://www.qfedu.com/xml" elementFormDefault="qualified">
    <!-- 根节点名字和包含的内容,内容是自定义studentType -->
    <xsd:element name="students" type="studentsType"/>
    <!-- studentsType 根节点对应类型声明   -->
    <xsd:complexType name="studentsType">
        <xsd:sequence>
            <!-- students根节点中存放的是student类型  type="studentType" 要求student的个数从0开始 个数不限制 -->
            <xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>
    <!-- studentType声明 -->
    <xsd:complexType name="studentType">
        <xsd:sequence>
            <!-- 要求student标签内有name,age,sex子标签,并且要求对一个对应保存的数据类型是type指定 -->
            <xsd:element name="name" type="xsd:string"/>
            <!-- ageType 和 sexType 是自定义数据约束 -->
            <xsd:element name="age" type="ageType" />
            <xsd:element name="sex" type="sexType" />
        </xsd:sequence>
        <!-- 给予Student标签属性 属性为id,要声明idType, use="required"不可缺少的 -->
        <xsd:attribute name="id" type="idType" use="required"/>
    </xsd:complexType>
    <!-- sexType性别类型声明 -->
    <xsd:simpleType name="sexType">
        <xsd:restriction base="xsd:string">
            <!-- 有且只有两个数据 male female -->
            <xsd:enumeration value="male"/>
            <xsd:enumeration value="female"/>
        </xsd:restriction>
    </xsd:simpleType>
    <!-- ageType年龄类型声明 -->
    <xsd:simpleType name="ageType">
        <xsd:restriction base="xsd:integer">
            <!-- 0 ~ 256 要求范围,是一个integer类型 -->
            <xsd:minInclusive value="0"/>
            <xsd:maxInclusive value="128"/>
        </xsd:restriction>
    </xsd:simpleType>
    <!-- idType id类型声明 -->
    <xsd:simpleType name="idType">
        <xsd:restriction base="xsd:string">
            <!-- ID类型,要求ZZ2011_xxxx(四位数字) -->
            <xsd:pattern value="ZZ2218_\d{4}"/>
        </xsd:restriction>
    </xsd:simpleType>
</xsd:schema>

在xml文件中,顶部的配置会导入xsd文件,并且会按照xsd文件的规范进行配置文件的编写

<?xml version="1.0" encoding="utf-8"?>

<!--
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 引入 XML Schema 官方规范要求

xmlns="http://www.qfedu.com/xml"
xsi:schemaLocation="http://www.qfedu.com/xml  student.xsd"
    引入声明当前自定义的 student.xsd 文件 类似于导包
-->
<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns="http://www.qfedu.com/xml"
          xsi:schemaLocation="http://www.qfedu.com/xml  student.xsd">
    <student id="GP2301_0001">
        <name>龙哥</name>
        <age>22</age>
        <sex>male</sex>
    </student>
    <student id="GP2301_0002">
        <name>三不沾</name>
        <age>87</age>
        <sex>male</sex>
    </student>
    <student id="GP2301_0003">
        <name>三不沾</name>
        <age>87</age>
        <sex>male</sex>
    </student>
</students>

二、HTTP

2.1 基本介绍

HTTP(Hyper Text Transfer Protocol):超文本传输协议。从万维网传服务器传输超文本到本地浏览器的传送协议

HTTP是应用层协议,是基于TCP/IP通信协议来传输数据的。

2.2 HTTP 协议请求头 Request

# 浏览器提交数据的形式为 GET 请求方式,
# / 请求资源是当前服务器的根目录资源 
# HTTP/1.1 表示当前的请求的协议使用的 HTTP/1.1 协议
GET / HTTP/1.1
# 告知 服务器当前 浏览器支持的数据类型
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
# 当前浏览器支持的相关文件类型
Accept-Encoding: gzip, deflate, br
# 浏览器支持的语言
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,ja;q=0.7,zh-TW;q=0.6
# 表示保持连接状态
Connection: keep-alive
# 【核心知识点】会话控制技术,对应 Cookie and Session 可以用于存储用户的相关数据,浏览信息,【令牌】
Cookie: PSTM=1649475867; BIDUPSID=9F672DC1210F6FE52BA93CE7B740D0C4; 
BAIDUID=FD51757FEC2FB00A454A8309BEB8C23D:SL=0:NR=10:FG=1; 
BD_UPN=12314753;

2.3 HTTP 协议响应头 Response

# 当前响应对应的协议包括状态码 当前表明使用的协议是 HTTP/1.1 协议,同时状态码是 200
HTTP/1.1 200 OK
Bdpagetype: 2
# baidu 根据业务所需,自行指定的响应头数据
Bdqid: 0xd1389d9f001ba7aa
# 表示保持连接状态
Connection: keep-alive
# Content 内容 Encoding 编码形式
Content-Encoding: gzip
# 页面内容类型和对应的编码集,当前页面内容为可视化文本 HTML 文件,同时编码集为 utf-8
Content-Type: text/html; charset=utf-8
# 格林尼治时间,如果需要展示为当前 北京时间 + 8 
Date: Thu, 23 Mar 2023 06:44:51 GMT
# 当前服务器的版本 BWS Baidu WebServer 服务器 1.1 版本
Server: BWS/1.1
# 【核心】会话控制技术,服务器发送给浏览器 Cookie 数据保存,Cookie 数据是一个【键值对数据】
Set-Cookie: BDSVRTM=382; path=/
Set-Cookie: BD_HOME=1; path=/

2.4 状态码

状态码就是服务器发送给浏览器的一种运行的状态结果码

状态码分类说明
1xx响应中——临时状态码,表示请求已经接受,告诉客户端应该继续请求或者如果它已经完成则忽略它
2xx成功——表示请求已经被成功接收,处理已完成
3xx重定向——重定向到其它地方:它让客户端再发起一个请求以完成整个处理。
4xx客户端错误——处理发生错误,责任在客户端,如:客户端的请求一个不存在的资源,客户端未被授权,禁止访问等
5xx服务器端错误——处理发生错误,责任在服务端,如:服务端抛出异常,路由出错,HTTP版本不支持等

状态码大全:https://cloud.tencent.com/developer/chapter/13553

常见的一些状态码:仅供参考

状态码英文描述解释
200OK客户端请求成功,即处理成功,这是我们最想看到的状态码
302Found指示所请求的资源已移动到由Location响应头给定的 URL,浏览器会自动重新访问到这个页面
304Not Modified告诉客户端,你请求的资源至上次取得后,服务端并未更改,你直接用你本地缓存吧。隐式重定向
400Bad Request客户端请求有语法错误,不能被服务器所理解
403Forbidden服务器收到请求,但是拒绝提供服务,比如:没有权限访问相关资源
404Not Found请求资源不存在,一般是URL输入有误,或者网站资源被删除了
428Precondition Required服务器要求有条件的请求,告诉客户端要想访问该资源,必须携带特定的请求头
429Too Many Requests太多请求,可以限制客户端请求某个资源的数量,配合 Retry-After(多长时间后可以请求)响应头一起使用
431 Request Header Fields Too Large请求头太大,服务器不愿意处理请求,因为它的头部字段太大。请求可以在减少请求头域的大小后重新提交。
405Method Not Allowed请求方式有误,比如应该用GET请求方式的资源,用了POST
500Internal Server Error服务器发生不可预期的错误。服务器出异常了,赶紧看日志去吧
503Service Unavailable服务器尚未准备好处理请求,服务器刚刚启动,还未初始化好
511Network Authentication Required客户端需要进行身份验证才能获得网络访问权限
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值