- 文档
- 教程
【免费下载链接】learnxinyminutes-docs
Code documentation written as code! How novel and totally my idea!
XML(eXtensible Markup Language)是一种被设计用来存储数据与传输数据的标记语言,它既追求人类可读,也追求机器可读。与 HTML 不同,XML 不规定数据如何显示或格式化,它只负责"携带"数据——正是这种"数据与表现分离"的定位,使它成为配置文件、数据交换与文档描述领域的经典选择。本文以本仓库的 es/xml.md 西班牙语教程为主线,结合 英文原版 与 zh-cn 中文译本,系统讲解 XML 的语法要素、树形结构、属性与元素的区别,以及如何用 DTD 从"格式良好"走向"有效校验",读完即可独立读懂并编写、校验标准 XML 文档。
XML 是什么:存储与传输数据的标记语言
XML 的定位非常清晰:保存数据、传输数据,而不是展示数据。教程开篇即点明:
XML 是一个被设计用来保存和传输数据的语言。与 HTML 不同,XML 不指定如何展示信息,它只是保存信息。
HTML 负责"长得好看"(决定排版与显示),XML 负责"说得清楚"(决定数据结构与含义)。这一区别带来两个直接推论:
- 人类可读:一个结构良好的 XML 文件,即使不使用任何解析器,肉眼也能读懂其中的业务含义;
- 机器可读:XML 解析器(Parser)可以按严格的语法规则提取出结构化的数据。
在仓库的 xml.md 英文原版中还强调了一个关键区分:内容(content)与标记(markup)。简单说,内容可以是任意文本,而标记(标签、属性、注释)是事先定义好的语法元素,解析器正是靠识别标记来分离出内容。
XML 基本语法:注释、声明与树形结构
XML 的语法规则非常严格,解析器遇到格式错误的文档会直接停止解析。下面是教程中给出的完整语法示例,其中每一处都伴随注释说明:
<!-- XML 中的注释长这样 --> <?xml version="1.0" encoding="UTF-8"?> <bookstore> <book category="COOKING"> <title lang="en">Everyday Italian</title> <author>Giada De Laurentiis</author> <year>2005</year> <price>30.00</price> </book> <book category="CHILDREN"> <title lang="en">Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> <book category="WEB"> <title lang="en">Learning XML</title> <author>Erik T. Ray</author> <year>2003</year> <price>39.95</price> </book> </bookstore>逐行拆解这份典型文件:
- XML 声明(prolog):
<?xml version="1.0" encoding="UTF-8"?>位于文件第一行,用于通知解析器元数据(版本与编码),它是可选但强烈推荐的; - 树形结构:XML 使用树形结构组织数据。此例中根节点是
bookstore,它有三个子节点(三个book),每个book又继续拥有title、author、year、price等子节点,层层嵌套; - 节点的创建:节点通过"开标签 + 关标签"创建,位于开标签与关标签之间的内容就是子节点。
元素与属性:XML 携带的两类数据
教程用一个醒目的注释总结 XML 只携带两类信息:
- 属性(Attributes)——节点的元数据。格式为
name="value",写在开标签内部。解析器通常借助属性信息来正确地组织数据; - 元素(Elements)——纯数据本身。位于开标签与关标签之间,是解析器真正从 XML 文件里提取的内容。
一个同时携带元素文本与多个属性的典型示例:
<!-- 下面是一个带有两个属性的元素 --> <file type="gif" id="4293">computer.gif</file>这里type与id是属性(元数据),computer.gif是元素内容(数据本体)。
元素与属性的深入规则(英文原版补充)
西班牙语版教程聚焦"会用",英文原版 xml.md 则补充了更完整的语法规则,这里一并归纳:
- 两种元素形式:空元素
<element1 attribute="value" />(不承载任何内容,纯粹是标记)与非空元素<element2 attribute="value">Content</element2>; - 标签构成:非空元素由开标签、内容、关标签三部分组成,如
<notempty>...内容...</notempty>; - 名称规则与大小写敏感:元素名只能包含字母和数字,且大小写敏感——
<element />与<eLEMENT />是两个完全不同的元素; - 属性特性:属性是键值对,只能出现在元素内、每个元素中同一属性最多出现一次且只持有一个值,常见的变通做法是用空格分隔的值列表(如
many="space-separated list"); - 嵌套与树术语:元素内容可以包含其他元素,采用标准树命名法——每个元素都是一个节点(node),上一层是父节点(parent),下一层是子节点(children),同一父节点下的元素互为兄弟节点(siblings);
- 空白保留:XML 会原样保留空白字符,因此
<child>\n Text\n</child>与<child>Text</child>并不是同一份内容。
格式良好(Well-formed)与有效性(Valid):两种不同层次的约束
教程专门用一节区分两个极易混淆的概念:
一个 XML 文档如果语法正确,就是**格式良好(well-formed)的。但还可以通过文档定义(如 DTD 或 XML Schema)向文档中注入更多限制。一个遵循某个文档定义(模式)的 XML 文档,对该定义而言就是有效(valid)**的。
换句话说:
- 格式良好:满足 XML 语法规则(标签闭合、正确嵌套、属性加引号等),这是解析器能正常读取的前提;
- 有效:在格式良好的基础上,进一步满足外部定义的结构约束(某个节点必须出现几次、必须包含哪些子节点、属性默认值是什么)。
这正是 DTD(Document Type Definition)的用武之地——借助它,你可以在应用逻辑之外预先校验 XML 数据,把合法性检查前移到数据入口处。
外部 DTD:用独立文件声明文档结构
教程展示了如何通过DOCTYPE引用一个外部的 DTD 文件:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE note SYSTEM "Bookstore.dtd"> <bookstore> <book category="COOKING"> <title>Everyday Italian</title> <price>30.00</price> </book> </bookstore><!DOCTYPE note SYSTEM "Bookstore.dtd">声明了根元素(bookstore)以及 DTD 文件的路径(Bookstore.dtd)。注意此例中<book>只保留了title与price两个子节点,对应下方 DTD 的简化约束。
对应的 DTD 文件内容(Bookstore.dtd)可能长这样:
<!DOCTYPE note [ <!ELEMENT bookstore (book+)> <!ELEMENT book (title,price)> <!ATTLIST book category CDATA "Literature"> <!ELEMENT title (#PCDATA)> <!ELEMENT price (#PCDATA)> ]>逐条解读这份 DTD 的语义:
<!ELEMENT bookstore (book+)>:声明根节点bookstore,括号中的book+表示它必须包含一个或多个book子节点(+是出现次数限定符);<!ELEMENT book (title,price)>:每个book必须恰好包含一个title和一个price(按顺序);<!ATTLIST book category CDATA "Literature">:book应当带有一个名为category的属性,类型为 CDATA(字符数据),若未显式给出,则取默认值"Literature";<!ELEMENT title (#PCDATA)>与<!ELEMENT price (#PCDATA)>:这两个节点只能包含已解析的字符数据(parsed character data),即只能有纯文本、不能再有子元素。
值得留意的是,教程的示例中属性值写作category="COOKING",而 DTD 声明了category属性的默认值为"Literature"——这正是校验的意义:若某处遗漏该属性,校验器就会应用 DTD 中规定的默认值,保证数据结构的一致性。
内部 DTD:把定义直接写进 XML 文件
除了外部引用,DTD 也可以直接内嵌在 XML 文件自身的DOCTYPE中:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE note [ <!ELEMENT bookstore (book+)> <!ELEMENT book (title,price)> <!ATTLIST book category CDATA "Literature"> <!ELEMENT title (#PCDATA)> <!ELEMENT price (#PCDATA)> ]> <bookstore> <book category="COOKING"> <title>Everyday Italian</title> <price>30.00</price> </book> </bookstore>内部 DTD 与外部 DTD 的约束声明完全一致,区别仅在于定义的位置:内部形式适合小规模、自包含的文档;外部形式便于多个文档共享同一套结构约束,是更利于复用的工程化做法。
DTD 的局限与 XSD:现代替代方案
英文原版 xml.md 在结尾补充了 DTD 的历史背景与演进方向:
DTD 的支持之所以无处不在,是因为它足够古老。遗憾的是,命名空间(namespaces)等现代 XML 特性并不被 DTD 支持。XML Schema Definition(XSD)正是为取代 DTD、定义 XML 文档文法而生的。
这是选型时的重要提醒:DTD 兼容性极好但表达能力有限;当需要命名空间、数据类型约束(如整数、日期)等现代特性时,应转向 XSD。教程中同时提供了在线校验 XML 以及 XSD 教程的延伸阅读入口,作为实战查漏补缺的工具。
在 learnxinyminutes-docs 中的组织方式与学习价值
本仓库(learnxinyminutes-docs)的核心理念是"以代码形式编写的文档"(Code documentation written as code!),每一篇教程都以"带注释的合法代码"为骨架展开讲解。XML 教程遵循同样的规范:
- 每个语言/格式教程对应一个 Markdown 文件,如英文原版 xml.md、西班牙语版 es/xml.md、中文版 zh-cn/xml.md;
- 文件头部是 YAML frontmatter 元数据(作者 contributors、译者 translators 等),由仓库的 lint/frontmatter.py 统一校验——该脚本用 yamllint 检查格式,并限制
name、filename、contributors、translators等允许的键,详见 CONTRIBUTING.md; - 英文版 frontmatter 还声明了
filename: learnxml.xml,即该教程配套的可下载示例代码文件名,网站构建时会把文章中的代码片段拼合为可下载文件。
因此,阅读本教程时你可以横向对照三种语言版本:英文版结构最完整(含元素嵌套、空白保留、XSD 对比等进阶细节),西班牙语与中文版更聚焦核心语法与 DTD 校验。无论哪一版,掌握"格式良好 ≠ 有效"、属性与元素的二分、以及DTD 外部/内部两种声明方式这三条主线,就抓住了 XML 使用的精髓,足以支撑你在实际项目中编写、阅读并校验 XML 数据。
- 文档
- 教程
【免费下载链接】learnxinyminutes-docs
Code documentation written as code! How novel and totally my idea!
相关推荐
从语法到工程实践:learnxinyminutes-docs 中的 Markdown 全面指南
从语法到工程实践:learnxinyminutes docs 中的 Markdown 全面指南 Markdown 是 John Gruber 于 2004 年设
文档教程Clojure 速成指南(learnxinyminutes-docs):从 Lisp 语法到 JVM 并发与 STM 状态管理
Clojure 速成指南(learnxinyminutes docs):从 Lisp 语法到 JVM 并发与 STM 状态管理 Clojure 是一门运行在 J
文档教程CoffeeScript 入门指南:从西班牙语教程看编译到 JavaScript 的语法速览(learnxinyminutes-docs)
CoffeeScript 入门指南:从西班牙语教程看编译到 JavaScript 的语法速览(learnxinyminutes docs) 导读 本文以 lea
文档教程
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考