当前位置: 首页 > news >正文

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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/utilhttp://www.springframework.org/schema/util/spring-util.xsdhttp://www.springframework.org/schema/contexthttp://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 的相关知识或者是其他技术,可以在我的评论区留言,我将会持续输出更有意思的内容。

相关文章:

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

背景 在Java开发的过程中&#xff0c;我们经常需要和配置文件打交道&#xff0c;其中接触最多的就是XML。从最初学习 JavaWeb 时在 Tomcat 中配置servlet&#xff0c;到后来接触Spring框架并在XML中编写各种配置&#xff0c;XML一直是不可或缺的一部分。然而&#xff0c;XML的…...

Python中的HTTP代理服务器和客户端的区别与联系

在Python编程中&#xff0c;当我们涉及到网络通信&#xff0c;尤其是HTTP请求时&#xff0c;经常会听到“HTTP代理服务器”和“客户端”这两个词。它们在网络世界中扮演着不同的角色&#xff0c;但又有着紧密的联系。 区别 首先&#xff0c;我们来谈谈它们的区别。 HTTP代理…...

升级Oracle 单实例数据库19.3到19.22

需求 我的Oracle Database Vagrant Box初始版本为19.3&#xff0c;需要升级到最新的RU&#xff0c;当前为19.22。 以下操作时间为为2024年2月5日。 补丁下载 补丁下载文档参见MOS文档&#xff1a;Primary Note for Database Proactive Patch Program (Doc ID 888.1)。 补丁…...

在Vue中如何动态绑定class和style属性

在Vue中&#xff0c;动态绑定class和style属性是我们经常遇到的需求。这个功能允许我们根据不同的条件来动态改变元素的样式&#xff0c;让我们的应用更加灵活和富有交互性。在本篇博客文章中&#xff0c;我将带你深入探索在Vue中如何实现这一功能。 首先&#xff0c;让我们了…...

使用Docker部署DashDot服务器仪表盘并结合cpolar实现公网监测服务器

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 文章目录 1. 本地环境检查1.1 安装docker1.2 下载Dashdot镜像 2.…...

Android kernel logcat时间戳显示错乱修改

前言 在抓取log时发现&#xff0c;kernel log合logcat的时间戳不对应。在分析log时&#xff0c;造成很大的困扰 修改 针对Android 10 的修改 diff --git a/system/core/logd/LogKlog.cpp b/system/core/logd/LogKlog.cpp old mode 100644 new mode 100755 index edd326a..f…...

2024年考PMP还有什么用?

PMP 是项目管理专业人士资格认证的意思&#xff0c;也是项目管理领域通用的证书&#xff0c; 做项目的基本都会去考。 要说 PMP 有啥作用&#xff1f; 个人感觉 PMP 证书更多的是跳槽、转行的敲门砖的作用&#xff0c;因为现在很多公司都要 PMP 证书&#xff0c;有了可以加分…...

解决zabbix图像中文乱码

使用zabbix查看监控图像信息&#xff0c;发现会有中文乱码现象。 解决方法如下&#xff1a; 1.拷贝windows文字文件到服务器上 C:\Windows\Fonts目录下拷贝自己需要的中文语言文件 2.修改配置文件 vim /usr/share/zabbix/include/defines.inc.php 81行 define(ZBX_GRAPH_F…...

centos间文件传输

scp /home/vagrant/minio zx192.168.56.34:/home/zx /home/vagrant/minio 是你要传输的文件而且是当前机器登录用户有权限操作的文件 zx是目标机器的用户192.168.56.34是目标机器的地址 /home/zx是要传到这个文件夹下 要确保zx有/home/zx这个文件夹的操作权限 本质就是ssh文…...

2.0 Zookeeper 安装配置

Linux 安装 zookeeper 下载地址为: Apache ZooKeeper。 选择一稳定版本&#xff0c;本教程使用的 release 版本为3.4.14&#xff0c;下载并安装。 打开网址 https://www.apache.org/dyn/closer.lua/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz&#xff0c;看到如下界…...

Matomo 访问图形显示异常

近期我们的把 PHP 系统完全升级后&#xff0c;访问 Matomo 的站点有关访问的曲线无法显示。 出现的情况如下图&#xff1a; 我们可以看到图片中有关的访问曲线无法显示。 如果具体直接访问链接的话&#xff0c;会有下面的错误信息。 问题和解决 出现上面问题的原因是缺少 ph…...

MySQL学习记录——사 表结构的操作

文章目录 1、创建表2、查看表结构3、改变表结构4、删除表5、总结 1、创建表 CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎; 例子 create table users ( id int, name varchar(20) c…...

【华为 ICT HCIA eNSP 习题汇总】——题目集12

1、企业网络内部常常采用私有 IP 地址进行通信&#xff0c;以下哪个地址属于私有 IP 地址&#xff1f; A、0.1.1.1 B、127.5.4.3 C、128.0.0.5 D、172.24.35.36 考点&#xff1a;网络层 解析&#xff1a;&#xff08;D&#xff09; A类 IP 地址中&#xff0c;10.0.0.0 ~ 10.255…...

Redis发布订阅及事务管理

目录 1.1 发布订阅 1.1.1 什么是发布订阅 1.1.2 常用命令 1.1.3 示例演示 1.2 事务管理 1.2.1 事务定义 1.2.2 Multi、Exec、discard 1.2.3 示例 1.2.4 事务的错误处理 1.2.5 事务的冲突问题 1.2.5.1 事务场景 1.2.5.2 悲观锁 1.2.5.3 乐观锁 1.2.5.4 事务解决冲…...

设计模式第五天|代理模式 7-小明买房子 装饰模式 8-咖啡加糖

目录 【设计模式专题之代理模式】7-小明买房子【设计模式专题装饰模式】8-咖啡加糖 【设计模式专题之代理模式】7-小明买房子 文章链接&#xff1a;卡码网设计模式 题目链接&#xff1a;7-小明买房子 这里注意在HomeAgent类里需要定义对象成员变量HomeBuyer&#xff0c;这里在实…...

mongodb数据库集合(表)的创建和数据修改

文章目录 前言发现宝藏一、集合的创建二、集合的修改三、数据插入数据库四、清空数据库集合数据 前言 为了巩固所学的知识&#xff0c;作者尝试着开始发布一些学习笔记类的博客&#xff0c;方便日后回顾。当然&#xff0c;如果能帮到一些萌新进行新技术的学习那也是极好的。作…...

MySQL 的UI

MySQL也有许多用户界面&#xff08;UI&#xff09;工具&#xff0c;用于管理数据库。以下是一些流行的MySQL UI工具&#xff1a; 1. **MySQL Workbench&#xff1a;** 由MySQL官方提供&#xff0c;功能强大&#xff0c;支持数据库建模、SQL开发、服务器配置等。 2. **DBeaver&a…...

Leetcode 3026. Maximum Good Subarray Sum

Leetcode 3026. Maximum Good Subarray Sum 1. 解题思路2. 代码实现 题目链接&#xff1a;3026. Maximum Good Subarray Sum 1. 解题思路 这一题的话主要就是要快速遍历所有的good subarray并快速获得每一个good subarray的和的最大值。 因此&#xff0c;问题就主要就成了两…...

elementUI之el-form-item的嵌套的场景

像这种&#xff0c;计费规则这几个字而且带红点&#xff0c;外观上是el-form-item&#xff0c;但是其并没有直接和控件进行相关联&#xff0c;这是和其他的el-form-item不同之处。所以这里就得用上嵌套了。也就是说elementUI中el-form-item是可以嵌套使用的。...

Linux项目自动化构建工具之make/Makefile演示gcc编译

文章目录 一、背景二、如何使用&#xff1f;三、原理四、关于make的问题五、再次理解/编写makefile依赖关系依赖方法 六、原理讲解项目清理makefile是支持变量的取消执行make后显示命令依赖方法可以多行 一、背景 会不会写makefile&#xff0c;从一个侧面说明了一个人是否具备…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...