XML全称是可扩展标记语言,它和HTML同属标记语言家族,但设计目标完全不同,在很多技术领域都有不可替代的作用,初学者掌握它能为后续学习很多技术栈打下基础。

XML的核心用途
XML的作用主要体现在以下几个常见场景中:
- 数据交换载体:不同系统、不同编程语言之间的数据格式不统一时,XML可以作为通用的中间格式传递数据,比如早期很多Web服务的接口数据就采用XML格式。
- 程序配置文件:很多软件、框架会用XML来保存配置信息,比如Java生态里的Spring框架早期配置文件、Tomcat服务器的配置文件都是XML格式,结构清晰易修改。
- 数据存储:对于结构不复杂的小型数据,XML可以直接作为存储格式,比如一些单机软件的本地配置、小型项目的元数据都会用XML保存。
- 文档描述:可以自定义标签来描述文档结构,比如很多出版行业的电子文档、技术文档的源文件会采用XML的衍生格式来编写。
初学者学习XML的完整路径
第一步:掌握基础语法规则
XML的基础语法并不复杂,核心要记住以下几个规则:
- XML文档必须有一个根元素,所有其他元素都包含在根元素内部。
- 标签必须成对出现,有开始标签就要有对应的结束标签,比如<user>对应的结束标签是</user>。
- 标签区分大小写,<User>和<user>是两个不同的标签。
- 属性值必须用英文双引号包裹,比如<user id="1">是正确的,<user id=1>是错误的。
- 特殊字符需要转义,比如小于号要写成
<,大于号写成>,和号写成&。
下面是一个符合基础语法的XML示例:
<?xml version="1.0" encoding="UTF-8"?>
<users>
<user id="1">
<name>张三</name>
<age>25</age>
<hobby>跑步</hobby>
</user>
<user id="2">
<name>李四</name>
<age>28</age>
<hobby>阅读</hobby>
</user>
</users>
第二步:学习XML的约束规范
实际使用中,我们往往需要规定XML中能出现哪些标签、标签的顺序、属性有哪些,这就需要学习两种常见的约束:
- DTD:全称是文档类型定义,是较早出现的约束方式,语法相对简单,但是功能有限,不支持数据类型的定义。
- XSD:全称是XML Schema Definition,是更现代的约束方式,支持数据类型、命名空间等高级特性,现在企业级项目中用得更多。
下面是一个简单的XSD约束示例,用来约束上面用户列表的XML结构:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://ipipp.com/user"
xmlns="http://ipipp.com/user"
elementFormDefault="qualified">
<xs:element name="users">
<xs:complexType>
<xs:sequence>
<xs:element name="user" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="age" type="xs:integer"/>
<xs:element name="hobby" type="xs:string"/>
</xs:sequence>
<xs:attribute name="id" type="xs:integer" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
第三步:学习XML的解析方式
学会写XML之后,还要学会用代码读取和处理XML内容,不同编程语言都有对应的XML解析库,常见的解析方式有两种:
- DOM解析:把整个XML文档加载到内存中,形成一棵DOM树,方便随机访问和修改节点,但是文档过大时占用内存多。
- SAX解析:基于事件驱动的解析方式,逐行读取XML文档,占用内存小,但是不能随机访问节点,只能顺序读取。
下面是用Java的DOM解析方式读取上面用户列表XML的示例代码:
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
public class XmlParseDemo {
public static void main(String[] args) {
try {
// 创建解析器工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
// 加载XML文件,这里路径根据实际文件位置调整
Document document = builder.parse(new File("users.xml"));
// 获取所有user标签
NodeList userNodes = document.getElementsByTagName("user");
for (int i = 0; i < userNodes.getLength(); i++) {
Element userElement = (Element) userNodes.item(i);
// 获取id属性
String id = userElement.getAttribute("id");
// 获取子标签内容
String name = userElement.getElementsByTagName("name").item(0).getTextContent();
String age = userElement.getElementsByTagName("age").item(0).getTextContent();
String hobby = userElement.getElementsByTagName("hobby").item(0).getTextContent();
System.out.println("用户ID:" + id + ",姓名:" + name + ",年龄:" + age + ",爱好:" + hobby);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
第四步:结合实际场景实践
掌握基础语法、约束和解析之后,要多结合实际场景练习,比如:
- 尝试给自己的小项目写一个XML格式的配置文件,比如保存数据库连接信息、程序运行参数。
- 尝试写一个XML文档用来存储自己整理的学习笔记目录,定义好对应的标签结构。
- 如果有接触Java框架,可以看看框架里的XML配置文件,对照语法规则理解每个标签的作用。
学习XML的常见注意事项
初学者学习过程中要注意几个容易踩坑的点:
- 不要把XML和HTML混淆,HTML是用来展示数据的,标签是预定义的;XML是用来传输和存储数据的,标签可以自定义。
- 写XML的时候尽量养成格式化缩进的习惯,方便后续阅读和维护,很多编辑器都有自动格式化XML的功能。
- 遇到解析报错的时候,先检查XML语法是否符合规范,比如标签是否闭合、属性值是否加引号,大部分报错都是基础语法问题导致的。