ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

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

learnxinyminutes-docs 之 XML 速学指南:从语法、树结构到 DTD 校验 文档教程【免费下载链接】learnxinyminutes-docsCode documentation written as code! How novel and totally my idea!项目地址https://gitcode.com/gh_mirrors/le/learnxinyminutes-docs点击查看免费下载XMLeXtensible 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 version1.0 encodingUTF-8? bookstore book categoryCOOKING title langenEveryday Italian/title authorGiada De Laurentiis/author year2005/year price30.00/price /book book categoryCHILDREN title langenHarry Potter/title authorJ K. Rowling/author year2005/year price29.99/price /book book categoryWEB title langenLearning XML/title authorErik T. Ray/author year2003/year price39.95/price /book /bookstore逐行拆解这份典型文件XML 声明prolog?xml version1.0 encodingUTF-8?位于文件第一行用于通知解析器元数据版本与编码它是可选但强烈推荐的树形结构XML 使用树形结构组织数据。此例中根节点是bookstore它有三个子节点三个book每个book又继续拥有title、author、year、price等子节点层层嵌套节点的创建节点通过开标签 关标签创建位于开标签与关标签之间的内容就是子节点。元素与属性XML 携带的两类数据教程用一个醒目的注释总结 XML 只携带两类信息属性Attributes——节点的元数据。格式为namevalue写在开标签内部。解析器通常借助属性信息来正确地组织数据元素Elements——纯数据本身。位于开标签与关标签之间是解析器真正从 XML 文件里提取的内容。一个同时携带元素文本与多个属性的典型示例!-- 下面是一个带有两个属性的元素 -- file typegif id4293computer.gif/file这里type与id是属性元数据computer.gif是元素内容数据本体。元素与属性的深入规则英文原版补充西班牙语版教程聚焦会用英文原版 xml.md 则补充了更完整的语法规则这里一并归纳两种元素形式空元素element1 attributevalue /不承载任何内容纯粹是标记与非空元素element2 attributevalueContent/element2标签构成非空元素由开标签、内容、关标签三部分组成如notempty...内容.../notempty名称规则与大小写敏感元素名只能包含字母和数字且大小写敏感——element /与eLEMENT /是两个完全不同的元素属性特性属性是键值对只能出现在元素内、每个元素中同一属性最多出现一次且只持有一个值常见的变通做法是用空格分隔的值列表如manyspace-separated list嵌套与树术语元素内容可以包含其他元素采用标准树命名法——每个元素都是一个节点node上一层是父节点parent下一层是子节点children同一父节点下的元素互为兄弟节点siblings空白保留XML 会原样保留空白字符因此child\n Text\n/child与childText/child并不是同一份内容。格式良好Well-formed与有效性Valid两种不同层次的约束教程专门用一节区分两个极易混淆的概念一个 XML 文档如果语法正确就是**格式良好well-formed的。但还可以通过文档定义如 DTD 或 XML Schema向文档中注入更多限制。一个遵循某个文档定义模式的 XML 文档对该定义而言就是有效valid**的。换句话说格式良好满足 XML 语法规则标签闭合、正确嵌套、属性加引号等这是解析器能正常读取的前提有效在格式良好的基础上进一步满足外部定义的结构约束某个节点必须出现几次、必须包含哪些子节点、属性默认值是什么。这正是 DTDDocument Type Definition的用武之地——借助它你可以在应用逻辑之外预先校验 XML 数据把合法性检查前移到数据入口处。外部 DTD用独立文件声明文档结构教程展示了如何通过DOCTYPE引用一个外部的 DTD 文件?xml version1.0 encodingUTF-8? !DOCTYPE note SYSTEM Bookstore.dtd bookstore book categoryCOOKING titleEveryday Italian/title price30.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 Literaturebook应当带有一个名为category的属性类型为 CDATA字符数据若未显式给出则取默认值Literature!ELEMENT title (#PCDATA)与!ELEMENT price (#PCDATA)这两个节点只能包含已解析的字符数据parsed character data即只能有纯文本、不能再有子元素。值得留意的是教程的示例中属性值写作categoryCOOKING而 DTD 声明了category属性的默认值为Literature——这正是校验的意义若某处遗漏该属性校验器就会应用 DTD 中规定的默认值保证数据结构的一致性。内部 DTD把定义直接写进 XML 文件除了外部引用DTD 也可以直接内嵌在 XML 文件自身的DOCTYPE中?xml version1.0 encodingUTF-8? !DOCTYPE note [ !ELEMENT bookstore (book) !ELEMENT book (title,price) !ATTLIST book category CDATA Literature !ELEMENT title (#PCDATA) !ELEMENT price (#PCDATA) ] bookstore book categoryCOOKING titleEveryday Italian/title price30.00/price /book /bookstore内部 DTD 与外部 DTD 的约束声明完全一致区别仅在于定义的位置内部形式适合小规模、自包含的文档外部形式便于多个文档共享同一套结构约束是更利于复用的工程化做法。DTD 的局限与 XSD现代替代方案英文原版 xml.md 在结尾补充了 DTD 的历史背景与演进方向DTD 的支持之所以无处不在是因为它足够古老。遗憾的是命名空间namespaces等现代 XML 特性并不被 DTD 支持。XML Schema DefinitionXSD正是为取代 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-docsCode documentation written as code! How novel and totally my idea!项目地址https://gitcode.com/gh_mirrors/le/learnxinyminutes-docs点击查看免费下载相关推荐从语法到工程实践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-docsCoffeeScript 入门指南从西班牙语教程看编译到 JavaScript 的语法速览learnxinyminutes docs 导读 本文以 lea文档教程上一篇Mac Mouse Fix让普通鼠标在macOS上超越苹果触控板的终极方案下一篇开源项目教程探索因果关系——causality创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进