news 2026/10/7 1:49:15

learnxinyminutes-docs 之 XML 速学指南:从语法、树结构到 DTD 校验

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
learnxinyminutes-docs 之 XML 速学指南:从语法、树结构到 DTD 校验
  • 文档
  • 教程

【免费下载链接】learnxinyminutes-docs

Code documentation written as code! How novel and totally my idea!

项目地址:https://gitcode.com/gh_mirrors/le/learnxinyminutes-docs
点击查看免费下载

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 只携带两类信息:

  1. 属性(Attributes)——节点的元数据。格式为name="value",写在开标签内部。解析器通常借助属性信息来正确地组织数据;
  2. 元素(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!

项目地址:https://gitcode.com/gh_mirrors/le/learnxinyminutes-docs
点击查看免费下载
上一篇:Mac Mouse Fix:让普通鼠标在macOS上超越苹果触控板的终极方案
下一篇:开源项目教程:探索因果关系——causality

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/7 1:48:00

STM32F103入门实战:从开发板认识、环境搭建到烧录调试全流程

1. 准备工作&#xff1a;先把开发板和工具认清楚做嵌入式开发这几年&#xff0c;我最大的感受是&#xff1a;许多新手倒在起跑线上&#xff0c;不是因为代码写不出来&#xff0c;而是因为开发环境没搭好&#xff0c;或者板子都没认清就开始写代码&#xff0c;最后连程序烧不进去…

作者头像 李华
网站建设 2026/10/7 1:47:01

Agent-Reach实战:让智能体从“能聊”到“能用”的完整指南

我去年在一家公司做内部知识库问答的Agent项目&#xff0c;模型本身选得不错&#xff0c;各个模块的prompt也调得挺顺&#xff0c;结果一上生产就卡住了——Agent什么都答得头头是道&#xff0c;但一问“这个月的账单数据是多少”“帮我拉一下昨天的CRM客户名单”&#xff0c;它…

作者头像 李华
网站建设 2026/10/7 1:45:22

彻底拆解SystemVerilog DPI-C:原理、实操与避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/7 1:45:20

从搜索框到Agent:联网搜索的核心技术与实操搭建

1. 从搜索框到 Agent 的演进逻辑1.1 为什么传统搜索框模式走到了瓶颈做过 Chatbot 的人都有一个共同体会&#xff1a;用户问“今天有什么值得关注的科技新闻”&#xff0c;如果机器人只能从训练数据里翻答案&#xff0c;那它给出的内容大概率停留在知识截止日期之前&#xff0c…

作者头像 李华