乐途乐途
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
    • HTTP协议
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • MyBatis
    • Spring
    • Spring MVC
    • Maven 入门
    • Maven 进阶
    • Java 设计模式
  • 缓存

    • Redis
联系
阿里云
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
    • HTTP协议
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • MyBatis
    • Spring
    • Spring MVC
    • Maven 入门
    • Maven 进阶
    • Java 设计模式
  • 缓存

    • Redis
联系
阿里云
  • 学习路径
  • XML 基础语法

    • XML 概述
    • XML 文档结构
    • XML 元素
    • XML 属性
    • XML 语法规则
    • XML 命名空间
    • XML 注释与处理指令
  • DTD 与文档验证

    • DTD 概述
    • DTD 元素声明
    • DTD 属性声明
    • DTD 实体声明
    • DTD 元素与属性对比
    • DTD 完整示例
  • XML Schema 定义

    • XML Schema 概述
    • XSD 简单类型
    • XSD 复杂类型
    • XSD 命名空间与引用
  • XPath 节点定位

    • XPath 概述
    • XPath 路径表达式
    • XPath 谓词与函数
  • XSLT 转换

    • XSLT 概述
    • XSLT 模板与匹配
    • XSLT 控制结构
    • XSLT 输出控制
  • XML 解析技术

    • XML 解析概述
    • DOM 解析
    • SAX 解析
    • StAX 解析
    • XML 与 Java — JAXP
  • XML 在 Java 中的应用

    • Spring XML 配置
    • MyBatis XML 映射
    • pom.xml 与 Maven
    • web.xml 配置详解
  • 现代数据格式对比

    • XML 与 JSON 对比
    • XML 与 YAML 对比
  • XML 显示与浏览器集成

    • XML 在浏览器中的显示
    • XMLHttpRequest 与 AJAX
    • 服务器端 XML 处理
  • XML 进阶查询与链接

    • XQuery 查询语言
    • XLink 超链接
    • XML 验证工具使用
  • XML Web 服务(选读)

    • XML Web 服务概述
    • SOAP 协议详解
    • WSDL 服务描述
    • RSS 内容聚合
    • RDF 资源描述框架

XML 概述

本章定位 :建立对 XML 的全局认知——它是什么、为什么存在、与 HTML 和 SGML 的关系,以及在真实世界中的典型应用场景。

定义与作用

XML (eXtensible Markup Language,可扩展标记语言)是 W3C 于 1998 年发布的一种 元标记语言 。与 HTML 使用预定义标签不同,XML 允许用户 自定义标签 来描述数据。它的核心使命不是"显示数据",而是"描述、存储和传输数据"。

XML 是 SGML (Standard Generalized Markup Language,标准通用标记语言)的精简子集。SGML 极其复杂(ISO 8879 标准长达 500+ 页),XML 保留了 SGML 80% 的功能但去掉了 80% 的复杂性——使其既强大又易于实现。

万维网技术栈中 XML 的位置 :

技术作用与 XML 的关系
HTML定义网页内容的呈现方式HTML 用预定义标签;XML 允许自定义标签
URL统一资源定位XML 数据可通过 URL 访问,常作为 Web Service 的数据格式
XML数据的描述、存储和传输万维网数据交换的通用语言

核心原理:XML 的设计目标与定位

W3C 十大设计目标

W3C 在 XML 1.0 规范中明确了十大设计目标,这十条原则至今仍是 XML 一切设计决策的出发点:

序号设计目标实践意义
1XML 应可直接用于互联网无需编译,文本格式,HTTP 友好
2XML 应支持多种应用从配置文件到 Web Service 到图形格式
3XML 应与 SGML 兼容现有 SGML 工具可迁移到 XML
4处理 XML 的程序应易于编写两周内即可写出一个 XML 解析器
5可选功能应尽可能少理想为零——减少互操作障碍
6文档应具备可读性人类可直接阅读和编辑 XML 文件
7设计应快速完成不追求完美,追求可用
8设计应形式化、简洁规范用 EBNF 严格定义
9文档应易于创建用记事本就能写 XML
10标记的简洁性不太重要宁可啰嗦也要保证清晰性

图解释 :SGML 是 XML 和 HTML 的共同祖先。XML 继承了 SGML 的结构化能力但大幅简化;HTML 继承了 SGML 的标记思想但标签固定。XML 不是要替代 HTML——它们分工明确:HTML 负责呈现,XML 负责数据结构。

语法/结构要点

HTML vs XML 全方位对比

特性HTMLXML
设计目的显示数据,控制页面呈现描述和传输数据
标签预定义(<p>, <h1>, <div>)完全自定义,用户创建标签
大小写不敏感(<P> = <p>)严格区分大小写
闭合要求宽松(某些标签可不闭合)所有标签必须闭合
属性值引号可不加引号(部分情况)必须加引号
空白处理多个空白合并为一个保留所有空白字符
错误容忍浏览器尽量渲染语法错误导致无法解析
关注点数据的外观数据的含义和结构

XML 典型应用场景

场景说明实例
数据传输不同系统间的数据交换格式Web Service(SOAP)、AJAX 响应
配置文件软件和框架的配置存储web.xml、pom.xml、AndroidManifest.xml
数据存储小型数据库或数据持久化RSS Feed、书籍目录
文档标记结构化文档格式XHTML、DOCX(Office Open XML)
图形格式矢量图形描述SVG(可缩放矢量图形)

完整示例:飞翔科技公司技术选型会议

场景说明

广州飞翔科技公司的 CTO 大翔 召集技术骨干讨论新项目的技术选型。后端开发 小崔 主张使用 JSON 作为数据交换格式,而架构师 白歌 认为 XML 更适合这个跨系统集成的项目。白歌通过一个"学生选课数据"的例子,展示了 XML 相比纯文本或 CSV 的优势。

操作前:用纯文本和 CSV 存储学生选课数据

纯文本方式 (无结构,难以程序处理):

学生:小崔,学号:2024001,课程:XML技术,教师:白歌,学分:3
学生:黄俪,学号:2024002,课程:Java高级,教师:大翔,学分:4

CSV方式 (无语义层次):

姓名,学号,课程,教师,学分
小崔,2024001,XML技术,白歌,3
黄俪,2024002,Java高级,大翔,4

问题:如果一门课有多个学生或一个学生选多门课,CSV 会变得难以处理。

应用 XML 后

<?xml version="1.0" encoding="UTF-8"?>
<enrollment_system>
  <course id="CS301" name="XML技术" credits="3">
    <instructor>
      <name>白歌</name>
      <email>baige@learnto.cn</email>
    </instructor>
    <students>
      <student id="2024001">
        <name>小崔</name>
        <major>计算机科学</major>
        <enroll_date>2024-09-01</enroll_date>
      </student>
      <student id="2024002">
        <name>黄俪</name>
        <major>软件工程</major>
        <enroll_date>2024-09-01</enroll_date>
      </student>
    </students>
  </course>
  <course id="CS402" name="Java高级" credits="4">
    <instructor>
      <name>大翔</name>
      <email>daxiang@learnto.cn</email>
    </instructor>
    <students>
      <student id="2024002">
        <name>黄俪</name>
        <major>软件工程</major>
        <enroll_date>2024-09-01</enroll_date>
      </student>
    </students>
  </course>
</enrollment_system>

操作结果

XML 方案的优势立刻显现:

  1. 层次清晰 :课程→教师→学生,嵌套关系一目了然
  2. 自描述 :标签名(<course>, <instructor>, <student>)本身就是文档
  3. 可扩展 :任何时候可以添加新字段(如 <grade>, <classroom>)而不影响现有结构
  4. 可验证 :可以通过 DTD/XSD 自动校验数据完整性

白歌总结:"XML 的核心价值不是语法本身,而是它提供了一套完整的技术生态——你可以用 DTD/XSD 验证结构,用 XPath 查询节点,用 XSLT 转换格式。这是 JSON 目前还做不到的。"

易错场景

错误一:混淆 XML 和 HTML 的容错机制

<!-- ❌ HTML 思维 —— 这在 XML 中会导致 fatal error -->
<note>
  <to>Alice
  <from>Bob</FROM>
  <body>Don't forget the meeting!</body>
</note>

问题:<to> 未闭合、<FROM> 大小写不匹配。HTML 浏览器会尽力渲染,XML 解析器直接报错。

<!-- ✅ 正确 -->
<note>
  <to>Alice</to>
  <from>Bob</from>
  <body>Don't forget the meeting!</body>
</note>

错误二:认为 XML 命名空间 URI 必须是可访问的 URL

很多初学者认为 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 指向一个真实的 Schema 文件。实际上, URI 仅仅是全局唯一标识符 ,解析器不会去访问它。使用 URL 格式只是因为域名天然具有全局唯一性。

错误三:认为 XML 已经过时

XML 在配置文件(Spring、Maven、Android)、文档格式(DOCX、ODF)、Web Service(SOAP)等领域仍然是不可替代的标准。JSON 在 Web API 场景占优,XML 在需要 Schema 验证和企业级集成的场景更合适。

面试考点

考点参考答案要点
XML 和 HTML 的本质区别是什么?HTML 是预定义标签的标记语言,用于显示数据;XML 是元标记语言,允许自定义标签,用于描述和传输数据。HTML 容错,XML 严格(语法错误即 fatal error)
为什么说 XML 是"元标记语言"?因为 XML 不预定义任何标签,而是提供一套创建标签的规则。你可以用 XML 定义自己的标记语言(如 RSS、SVG 都是基于 XML 的特定标记语言)
XML 的十大设计目标中,哪一条对你的项目影响最大?第4条(易于编写处理程序)和第5条(可选功能最少)——保证了 XML 的广泛工具支持和低学习曲线
XML 和 JSON 各适合什么场景?XML:需要 Schema 验证、复杂命名空间、文档标记、企业级集成的场景。JSON:轻量级 Web API、前端数据交互、NoSQL 数据库存储
下一页
XML 文档结构