XML即可扩展标记语言,全称是Extensible Markup Language,是一种用于标记电子文件使其具有结构性的标记语言。它起源于标准通用标记语言SGML,设计初衷是为了传输和存储数据,而不是像HTML那样用于展示数据。XML的标签没有被预定义,用户可以根据需要自行定义标签,这让它能够适配各种不同领域的数据描述需求。

XML的核心特性
XML之所以能在数据交换领域得到广泛应用,主要得益于以下几个核心特性:
- 自描述性:XML的标签和内容共同构成完整的语义信息,即使没有额外的文档说明,接收方也能大致理解数据的含义。
- 跨平台跨语言:XML是纯文本格式,几乎所有编程语言都提供了XML的解析库,不同操作系统、不同开发语言的系统都能处理XML数据。
- 可扩展性:用户可以根据业务需求自定义标签结构,不需要遵循固定的标签规范,能够灵活适配各类业务场景的数据描述要求。
- 结构化存储:XML采用树形结构组织数据,能够清晰表达数据之间的层级关系,适合存储复杂的结构化数据。
XML在数据交换中的角色
在不同系统之间进行数据交换时,经常会遇到数据格式不统一的问题,XML在其中主要承担以下几个角色:
1. 统一的数据载体
不同系统可能使用不同的数据格式存储数据,比如有的系统用JSON,有的用自定义二进制格式,有的用数据库表结构。XML可以作为中间通用载体,发送方将数据转换为XML格式发送,接收方解析XML后转换为自身系统支持的格式,从而打通不同系统之间的数据通道。
2. 结构化数据的传输容器
很多业务数据存在复杂的层级关系,比如订单数据包含订单基本信息、商品列表、收货地址等多个层级的内容。XML的树形结构可以天然表达这种层级关系,通过嵌套标签就能清晰描述数据的从属关系,避免数据在传输过程中出现结构丢失的问题。
3. Web服务的标准数据格式
早期的Web服务规范比如SOAP,就规定使用XML作为数据传输格式。服务端和客户端通过XML来封装请求参数和响应结果,保证不同技术栈开发的服务之间可以互相调用,这也是XML在数据交换领域非常经典的应用场景。
XML基础示例
下面是一个描述图书信息的XML示例,展示了XML的基本结构:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 图书信息集合 -->
<bookstore>
<book category="编程">
<title>XML入门教程</title>
<author>张三</author>
<price>59.9</price>
</book>
<book category="文学">
<title>散文精选</title>
<author>李四</author>
<price>39.8</price>
</book>
</bookstore>
这个XML文档首先声明了XML版本和编码,然后根标签是<bookstore>,内部包含两个<book>子标签,每个<book>又有<title>、<author>、<price>等子标签,清晰描述了图书的各类属性。
XML与JSON的对比
现在数据交换领域JSON的使用也非常广泛,两者各有适用场景,下面是简单的对比:
| 对比维度 | XML | JSON |
|---|---|---|
| 数据体积 | 标签冗余,体积较大 | 格式简洁,体积较小 |
| 解析难度 | 解析相对复杂,需要DOM或SAX解析器 | 解析简单,多数语言原生支持 |
| 自描述性 | 强,标签包含语义信息 | 弱,需要额外约定字段含义 |
| 适用场景 | 复杂结构化数据、企业级传统系统、需要强语义描述的场景 | 轻量数据交换、Web前端交互、移动端接口 |
XML解析示例
下面是使用Python的xml.etree.ElementTree库解析上面图书XML的示例:
import xml.etree.ElementTree as ET
# 解析XML字符串
xml_data = '''<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book category="编程">
<title>XML入门教程</title>
<author>张三</author>
<price>59.9</price>
</book>
</bookstore>'''
# 加载XML数据
root = ET.fromstring(xml_data)
# 遍历所有book标签
for book in root.findall('book'):
category = book.get('category') # 获取category属性
title = book.find('title').text # 获取title标签内容
author = book.find('author').text
price = book.find('price').text
print(f'分类: {category}, 书名: {title}, 作者: {author}, 价格: {price}')
运行上面的代码会输出图书的相关信息,这展示了XML被接收方解析后提取数据的基本流程,也是数据交换中接收方处理XML数据的典型操作。