2.4 编码->W3C XML 1.0标准(W3C Recommendation):XML(Extensible Markup Language)

一、核心定义与定位

XML(可扩展标记语言)是一种用于存储和传输数据的标记语言

核心特点是:

  • 可扩展 :你可以自定义标签(比如<book><user>),而非像 HTML 那样只能用预定义标签(<div><p>)。
  • 平台无关:跨语言、跨系统,是不同系统间数据交换的通用格式。
  • 易读易解析:人类可直接阅读,机器也能通过解析器轻松处理。

简单比喻:XML 就像 "数据的说明书",只描述数据是什么 (比如 "这是一本书的标题"),不描述数据怎么展示(这是 HTML 的职责)

二、XML 核心语法规则

XML 有严格的语法规范,违反则解析器会报错,核心规则如下:

基本结构(文档声明 + 根元素)

一个完整的 XML 文档必须包含:

  • 文档声明(可选但推荐):定义 XML 版本、编码等
  • 唯一的根元素:所有其他元素都嵌套在根元素内

示例(基础结构):

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>  <!-- 文档声明:版本1.0,编码UTF-8 -->
<library>                                <!-- 根元素:整个文档只有一个根 -->
    <book>                               <!-- 子元素 -->
        <title>Python编程:从入门到实践</title>
        <author>埃里克·马瑟斯</author>
        <price>89.00</price>
    </book>
</library>

核心语法规则(必须遵守)

规则 说明 错误示例 正确示例
标签必须闭合 所有标签要么成对(<a></a>),要么自闭合(<img /> <price>89.00 <price>89.00</price><br />
标签大小写敏感 <Book><book> 是不同标签 <Book><title>...</Book>(闭合用<book> <book><title>...</book>
元素必须正确嵌套 子元素必须完全包含在父元素内 <book><title>Python</book></title> <book><title>Python</title></book>
属性值必须加引号 属性(key="value")的值必须用单 / 双引号包裹 <book id=123> <book id="123"><book id='123'>
特殊字符转义 不能直接用 < > & " ',需转义 <price>89 & 99</price> <price>89 &amp; 99</price>

转义字符对照表:

原字符 转义字符 说明
< &lt; 小于号
> &gt; 大于号
& &amp; 和号
" &quot; 双引号
' ' 单引号

常见扩展语法

  • 注释 :格式为 <!-- 注释内容 -->,不会被解析器处理

    xml 复制代码
    <!-- 这是一本Python相关的书籍 -->
    <book id="123">
        <title>Python编程:从入门到实践</title>
    </book>
  • CDATA 段 :用于包裹无需转义的文本(比如代码、特殊字符),格式为 <![CDATA[ 内容 ]]>

    xml 复制代码
    <book>
        <description>
            <![CDATA[ 本书包含Python代码:print(10 > 5) & print("Hello") ]]>
        </description>
    </book>
  • 命名空间 :解决标签名冲突(比如两个<book>来自不同模块),用xmlns定义

    xml 复制代码
    <?xml version="1.0" encoding="UTF-8"?>
    <lib:library xmlns:lib="http://example.com/library"  <!-- 定义命名空间前缀lib -->
                 xmlns:store="http://example.com/store">
        <lib:book id="123">Python编程</lib:book>
        <store:book id="456">Java编程</store:book>
    </lib:library>

三、XML 解析(实战示例)

XML 的核心价值是 "传输 / 存储数据",实际开发中需要用代码解析 XML 提取数据,这里以 Python 为例(最常用的两种方式):

前置条件

确保安装了 Python 内置的解析库(无需额外安装):xml.etree.ElementTree(轻量)、xml.dom.minidom(DOM 方式)

示例:解析 XML 文件

假设有books.xml文件:

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<library>
    <book id="1">
        <title>Python编程:从入门到实践</title>
        <author>埃里克·马瑟斯</author>
        <price>89.00</price>
    </book>
    <book id="2">
        <title>Java核心技术</title>
        <author>凯·霍斯特曼</author>
        <price>129.00</price>
    </book>
</library>

ElementTree解析的代码:

python 复制代码
import xml.etree.ElementTree as ET

# 1. 解析XML文件
tree = ET.parse("books.xml")
root = tree.getroot()  # 获取根元素<library>

# 2. 遍历所有<book>元素,提取数据
for book in root.findall("book"):
    book_id = book.get("id")  # 获取属性值
    title = book.find("title").text  # 获取子元素文本
    author = book.find("author").text
    price = book.find("price").text
    print(f"书籍ID:{book_id},标题:{title},作者:{author},价格:{price}")

# 输出结果:
# 书籍ID:1,标题:Python编程:从入门到实践,作者:埃里克·马瑟斯,价格:89.00
# 书籍ID:2,标题:Java核心技术,作者:凯·霍斯特曼,价格:129.00

四、XML 典型使用场景

  1. 数据交换 :不同系统(比如 Java 后端和 Python 后端)间传输数据(虽现在 JSON 更常用,但老系统仍大量使用)
  2. 配置文件 :很多框架 / 工具用 XML 做配置(比如 Spring、MyBatis、AndroidManifest.xml)
  3. 数据存储 :小型应用的结构化数据存储(比如电子书元数据、配置清单)
  4. 文档规范 :用于定义数据格式(比如 XML Schema、DTD),确保数据交换的一致性

五、XML vs JSON(核心对比)

维度 XML JSON
语法复杂度 复杂(标签嵌套、声明、转义) 简洁(键值对、数组)
可读性 偏繁琐,但结构清晰 更易读,适合人类快速理解
解析效率 较低(需解析标签) 较高(轻量,解析更快)
扩展性 强(命名空间、Schema) 弱(无原生扩展机制)
适用场景 老系统、配置文件、严格的文档规范 现代 API、前端后端数据交互

总结

  1. XML 是可扩展的标记语言 ,核心用于存储 / 传输结构化数据,语法严格(标签闭合、嵌套、转义是关键)
  2. XML 的核心优势是可扩展、跨平台,但语法繁琐,现在数据交互场景逐渐被 JSON 替代,主要用于老系统和配置文件
  3. 解析 XML 时需遵守语法规则,常用工具(如 Python 的 ElementTree)可快速提取标签、属性、文本数据
相关推荐
FlyWIHTSKY2 小时前
vue3中const的使用和定义
前端·javascript·vue.js
小璐资源网2 小时前
如何写出干净、易维护的 HTML 结构
前端·html
gongzemin2 小时前
怎么在VS Code 调试vue3 源码
前端·vue.js
C澒2 小时前
微前端容器标准化 —— 公共能力篇:CDN 能力
前端·架构
wulijuan8886663 小时前
ECharts图表性能优化的那些事
前端·javascript·echarts
❀͜͡傀儡师3 小时前
通过npm 手动安装、Docker 部署 OpenClaw小龙虾
前端·docker·npm
前端AI充电站3 小时前
Google 开始卷价格了:Gemini 3.1 Flash-Lite,会不会把 AI 应用成本真的打下来?
前端·人工智能
风止何安啊3 小时前
数字太长看花眼?一招教它排好队:千分位处理的实现
前端·javascript·面试