5分钟快速掌握 XML (Extensible Markup Language)

背景

在Java开发的过程中,我们经常需要和配置文件打交道,其中接触最多的就是XML。从最初学习 JavaWeb 时在 Tomcat 中配置servlet,到后来接触Spring框架并在XML中编写各种配置,XML一直是不可或缺的一部分。然而,XML的复杂性给我留下了深刻的印象:它有众多的标签和属性,而且每种场景下的标签和属性都有所不同。更令人困惑的是,标签中还存在大量的xmlns属性,后面跟着一串网址,让人摸不着头脑。因此,每次配置Tomcat或Spring时,我总是习惯先在网上找一个配置文件模板,然后稍作修改就使用,对XML本身并没有深入的了解。最近正好有一些空闲的时间,就把这一块的空白好好填一填了。

XML 初体验

下面是一个Tomcat的配置文件示例,对于学习过JavaWeb的同学来说,这个配置应该不会陌生。它定义了与servlet相关的一些信息:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

  <!--servlet与servlet-mapping标签需同时使用-->
  <!--创建servlet标签-->
  <servlet>
    <!--给指定的servlet类起一个名字-->
    <servlet-name>demo01</servlet-name>
    <!--servlet类的全限定路径-->
    <servlet-class>demo</servlet-class>
    <!--servlet初始化加载优先级(0~10)-->
    <load-on-startup>0</load-on-startup>
  </servlet>

  <!--创建servlet映射标签-->
  <servlet-mapping>
    <!--映射到哪个servlet,与上面一致-->
    <servlet-name>demo01</servlet-name>
    <!--客户端访问路径 localhost:8080/项目名称/demo-->
    <url-pattern>/demo</url-pattern>
  </servlet-mapping>

</web-app>

而在Spring框架中,我们则使用另一种XML配置文件来定义bean的相关信息。下面是一个简单的Spring配置文件示例:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  
  <bean id="Demo01" class="com.hello.Demo01"></bean>
</beans>
 

在这个配置文件中,我们定义了一个id为"Demo01"的bean,它的类是"com.hello.Demo01"。通过这个配置文件,Spring框架能够创建和管理这个bean的实例。

XML 元素解析

通过前面两个 XML 文件的例子我们对于 XML 的格式有了一个大概的了解,下面我们就来一起分析一下 XML 中的元素,以及其代表的意义。

XML声明

首先是第一部分: <?xml version="1.0" encoding="UTF-8"?>
这是 XML 的声明部分,格式是 <?xml ?>version 是声明标签的属性,代表当前使用的 XML 格式的版本是 1.0。同理 encoding="UTF-8" 代表当前文件所使用的编码是 UTF-8。到这里,
我对于 XML 的声明产生了一些疑问,然后针对这些问题去查找了一些资料,以问答的形式分享给大家,不对的地方希望大家能指出。

Q:version 的取值哪些,也就是说目前 XML 存在哪些版本?
A:目前有两个版本 1.0 和 1.1,目前大多数应用程序仍然主要使用 1.0.

Q:encoding 的取值有哪些,即支持哪些编码格式?
A:主流的格式都支持,例如 UTF-8、UTF-16、ISO-8859-1、GB2312、GBK 等等等等。UTF-8 是最常用也是最推荐的。

Q:XML 声明的部分是不是只有 version 和 encoding 两个属性?
**A:其实还有一个属性 standalone ,它的取值是 “yes” 或 “no”,表示该文档是否独立(是否依赖外部资源),如果值为"yes",则意味着该文档不需要外部资源即可被解析;如果值为"no"

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

Q:声明是不是只能写在第一行?
A:推荐写在第一行,但是并没有严格的限制,只要它出现在文档开始处,且在任何元素或注释之前即可
image.png
Q:XML 文件一定要写声明吗?
A:推荐写声明,毕竟可以通过声明指定文件的编码类型,但是没有强制要求,不写也可以。

标签

在 XML 最重要也是最主要的元素就是标签,什么是标签呢?
在 tomcat 配置文件中 <web-app> 是标签,在 spring 配置文件中,<beans>也是标签,标签就是这样被尖括号包围的单词,它总是成对出现,例如 <web-app></web-app><beans></beans>
**在 XML 中必须要有一对根标签,所有的标签和信息都要在根标签里面,**如下的情况就不是一个 XML 格式的文件:

<name>张三</name>
<age>3</age>

如果只有一对 name 标签,或者是 age 标签都对。因为只有一对标签的情况下,那对标签就是根标签。两对标签并行的情况就是错的,没有办法识别谁是根标签,如果要改成正确的形式,要么在外面新增一个根标签:

<xxx>
    <name>张三</name>
    <age>3</age>
</xxx>

要么把其中一个标签放到另一个标签里面:

<name>张三
    <age>3</age>
</name>

相对于限制,XML 更多的是自由,**在 XML 中所有的标签都必须自定义,它没有所谓的官方标签,**这意味着开发人员可以根据需要创建自己的标签,以适应特定的数据结构和应用程序需求。也就是说在 Tomcat 中的 <web-app> 标签是 Tomcat 定义的,它的作用只能体现在 Tomcat 中,而在 Spring 中的 <beans> 也是 Spring 中定义的,换个地方它可能就没有作用了。为什么是可能?因为你也可以定义一样的标签然后赋予它意义。
在 XML 中标签只能完整包含其他标签,不能只包含标签的一部分。例如:

<name>张三
    <age>3</age>
    <aaa><bbb></aaa></bbb>
</name>

试图让一个标签只包含另一个标签的开始部分或结束部分,这在 XML 中是不允许的。

标签属性

在 XML 中的标签上也可以附加一些额外信息,它们以 key=“value” 的形式出现,这就是标签的属性,与标签一样是必须由用户自定义的。例如上文中出现的 bean 标签:<bean id="Demo01" class="com.hello.Demo01"></bean>,其中 id 和 class 就是 bean 标签的属性,它们是 bean 标签的附加信息。

命名空间

在上面的配置文件中我们注意到,根标签上有 xmlns 属性定义命名空间。

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

xmlns 的含义是 XML NameSpace 的缩写,即 XML 文件的命名空间,那么这个是干嘛用的呢?
在 XML 中,在不同的场景下可能存在含义不一样但是名称相同的标签,如果要在一个文档中使用,就需要想想办法,于是 XML 就有了命名空间用于区分含义不同但是名称相同的标签。
它的语法是:

xmlns:命名空间前缀="namespaceURI"

它可以出现在任意标签的开始标签中,用于指定该标签及其所有子标签所使用的命名空间。空间定义好之后,就可以通过在该标签名前添加对应的前缀来使用那个命名空间的标签。

<命名空间前缀:标签名></命名空间前缀:标签名>

例如:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
          http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans.xsd
          http://www.springframework.org/schema/util
          http://www.springframework.org/schema/util/spring-util.xsd
          http://www.springframework.org/schema/context
          http://www.springframework.org/schema/context/spring-context.xsd">

    <context:property-placeholder location="classpath:application.properties" />
    <util:property-placeholder location="classpath:other.properties" />
    <bean id="Demo01" class="com.hello.Demo01"></bean>
</beans>

Q:通过观察我们发现,为什么有的命名空间有前缀,例如 **xmlns:util****xmlns:context**等,而有一个却没有呢?
**A:因为在 XML 中可以指定默认的命名空间,它不需要指定前缀,所有没有前缀的标签都属于默认的命名空间。例如上文中出现的 ****<bean id="Demo01" class="com.hello.Demo01"></bean>**就属于默认的命名空间,显然默认的命名空间只能有一个。

Q:xmlns 的值(即 URI 字符串)的作用是什么?
A:xmlns 中的 URI 的主要作用是提供命名空间的唯一标识,而不是提供实际的资源或数据。因此,我们通常不会使用 URI 中的内容,而是使用 URI 来标识和引用命名空间,理论上我们可以用任意的字符串来作为命名空间的唯一标识,但在实际应用中,为了确保唯一性和可管理性,建议使用经过规划的、符合相关标准的URI。

总结

XML 是这样一种文档:

  1. 首先,它是由标签和属性组成,标签总是成对出现,且不能出现交叉(一个标签中包含另一个标签的一部分),属性则是用于描述标签的额外信息。
  2. XML 没有官方标签,必须由使用者自己去定义,并且赋予其意义
  3. 不同场景下可能会出现相同的标签,命名空间的出现就是为了区分它们。命名空间由 xmlns:前缀="命名空间URI”组成,理论上 可以使用任意字符串,但是建议使用 URI。

这篇文章不涉及 XML 的解析,只是作为一个快速入门,让你了解 XML 到底是一种什么样的数据结构,在实际的使用中面对其中的元素不至于一脸懵,当我们知道它的具体含义时,使用起来就会更得心应手。如果想要了解更多关于 XML 的相关知识或者是其他技术,可以在我的评论区留言,我将会持续输出更有意思的内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/368317.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在Vue中如何构建复杂表单?

概述 很有可能&#xff0c;在我们的软件工程旅程中&#xff0c;我们至少要构建一次复杂的表单。本文将介绍如何创建一个复杂的表单&#xff0c;该表单可以使用一些Vue特性(如v-for和v-model)逐步增强。它还提供了一些基本的Vue核心功能的复习&#xff0c;这些功能将在您日常使…

MySQL中去除重复(十一)

MySQL中去除重复(十一) 一、相同的行 我们要去除相同行要使用DISTINCT关键字 SELECT DISTINCT 列名 FROM 表名; distinct 是针对查询的结果集合进行去重而不是针对某一行或者某一列。 二、查询中的行选择 用 WHERE 子句限制从查询返回的行。一个 WHERE 子句包含一个 必须满…

【Matplotlib】figure方法之图形的保存

&#x1f388;个人主页&#xff1a;甜美的江 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;matplotlib &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

在flutter中集成Excel导入和导出

flutter中集成Excel导入和导出功能 1、需要的依赖 在pubspec.yaml #excel导出syncfusion_flutter_xlsio: ^24.1.45open_file: ^3.0.1#导入excelflutter_excel: ^1.0.1#选择文件的依赖file_picker: ^6.1.1&#xff08;1&#xff09;依赖说明 在测试时&#xff0c;我们在使用导…

Faster-Whisper 实时识别电脑语音转文本

Faster-Whisper 实时识别电脑语音转文本 前言项目搭建环境安装Faster-Whisper下载模型编写测试代码运行测试代码实时转写脚本实时转写WebSocket服务器模式 参考 前言 以前做的智能对话软件接的Baidu API&#xff0c;想换成本地的&#xff0c;就搭一套Faster-Whisper吧。 下面是…

25考研|660/880/1000/1800全年带刷计划

作为一个参加过两次研究生考试的老学姐&#xff0c;我觉得考研数学的难度完全取决于你自己 我自己就是一个很好的例子 21年数学题目是公认的简单&#xff0c;那一年考130的很多&#xff0c;但是我那一年只考了87分。但是22年又都说是有史以来最难的一年&#xff0c;和20年的难度…

centos 7 部署若依前后端分离项目

目录 一、新建数据库 二、修改需求配置 1.修改数据库连接 2.修改Redis连接信息 3.文件路径 4.日志存储路径调整 三、编译后端项目 四、编译前端项目 1.上传项目 2.安装依赖 3.构建生产环境 五、项目部署 1.创建目录 2.后端文件上传 3. 前端文件上传 六、服务启…

Linux信号详解~

目录 前言 一、初识信号 二、信号的概念 三、信号的发送与捕捉 3.1 信号的发送 3.1.1 kill 命令 3.1.2 kill 函数 3.1.3 raise函数 3.1.4 abort函数 3.2 信号的捕捉 3.2.1 signal函数 3.2.2 sigaction函数 3.2.3 图示 四、信号的产生 4.1 硬件异常产生信号 4.2 …

C++输出地址

下面是一段输出地址的程序。 #include <bits/stdc.h> using namespace std;int main() {int s;cout << &s;//原地址return 0; }假如有一个人&#xff08;的朋友&#xff09;后来了&#xff0c;他也想住进的房间&#xff0c;我们可以这样&#xff1a; #includ…

OfficeWeb365 Readfile 任意文件读取漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

windows下安装go

下载golang Go 官网下载地址&#xff1a; https://golang.org/dl/ Go 官方镜像站&#xff08;推荐&#xff09;&#xff1a; https://golang.google.cn/dl/ 选择安装包 验证有没有安装成功 查看 go 环境 说明 &#xff1a; Go1.11 版本之后无需手动配置环境变量&#xff0c…

Apache POl Excel

目录 介绍 Apache POl的应用场景&#xff1a; 入门使用 通过POI创建Excel文件并且写入文件内容 通过POI读取Excel文件中的内容 介绍 Apache POl是一个处理Miscrosoft Office各种文件格式的开源项目。简单来说就是&#xff0c;我们可以使用POI在Java程序中对Miscrosoft O…

VBA技术资料MF114:批量给Word文档添加页眉

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…

Acwing 141 周赛 解题报告 | 珂学家 | 逆序数+奇偶性分析

前言 整体评价 很普通的一场比赛&#xff0c;t2思维题&#xff0c;初做时愣了下&#xff0c;幸好反应过来了。t3猜猜乐&#xff0c;感觉和逆序数有关&#xff0c;和奇偶性有关。不过要注意int溢出。 欢迎关注: 珂朵莉的天空之城 A. 客人数量 题型: 签到 累加和即可 import…

简单说说mysql的日志

今天我们通过mysql日志了解mysqld的错误日志、慢查询日志、二进制日志&#xff0c;redolog, undolog等。揭示它们的作用和用途&#xff0c;让我们工作中更能驾驭mysql。 redo 日志 如果mysql事务提交后发生了宕机现象&#xff0c;那怎么保证数据的持久性与完整性&#xff1f;…

JAVA基础 队列

排队取奶茶 时间限制&#xff1a;1.000S 空间限制&#xff1a;128MB 题目描述 假设有一家奶茶店&#xff0c;现在有一些人在排队等待取奶茶&#xff0c;同时也有人在取奶茶。 请你设计一个程序模拟这种情况下的奶茶队列管理。 假设每个人取奶茶的时间非常短&#xff0c;可…

MySQL亿级数据的查询优化-历史表该如何建

前端时间在知乎上看到一个问题&#xff0c;今天有空整理并测试了一下&#xff1a; 这个问题很具体&#xff0c;所以还是可以去尝试优化一下&#xff0c;我们基于InnoDB并使用自增主键来讲。 比较简单的做法是将历史数据存放到另一个表中&#xff0c;与最近的数据分开。那是不是…

DockerCompose+SpringBoot+Nginx+Mysql实践

DockerComposeSpringBootNginxMysql实践 1、Spring Boot案例 首先我们先准备一个 Spring Boot 使用 Mysql 的小场景&#xff0c;我们做这样一个示例&#xff0c;使用 Spring Boot 做一个 Web 应 用&#xff0c;提供一个按照 IP 地址统计访问次数的方法&#xff0c;每次请求时…

【C语言/基础梳理/期末复习】动态内存管理(附思维导图)

目录 一、为什么要有动态内存分配 &#xff08;1&#xff09;我们已经掌握的内存方式的特点 &#xff08;2&#xff09;需求 二、malloc和free 2.1.malloc 2.1.1函数原型 2.1.2函数使用 2.1.3应用示例​编辑 2.2free 2.2.1函数原型 2.2.2函数使用 三、calloc和reallo…

Vue3 - 从 vue2 到 vue3 过渡,这一套就够了(案例 + 效果演示)(二)

目录 一、组合式 API 的使用 1.1、watch 函数 1.2、watchEffect 函数 1.3、toRef 和 toRefs 1.3.1、toRef 1.3.2、toRefs 1.4、vue3 的声明周期 一、组合式 API 的使用 1.1、watch 函数 与 vue2.x 中的 watch 配置功能一致&#xff0c;但是多了一些坑&#xff1a; 这…