【XML】《XML 实用教程》笔记

本贴最后更新于 2810 天前,其中的信息可能已经水流花落

XML 是 eXtensible Markup Language 的缩写,称之为可扩展标记语言。

符合 W3C 制定的基本语法规则的 XML 文件称为规范的 XML 文件,规范的 XML 文件如果再符合额外的一些约束就称之为有效的 XML 文件。

一个规范的 XML 文件应当满足如下语法规则:

  • XML 文件用“XML 声明”开始。
  • XML 文件有且仅有一个根标记
  • XML 的非根标记都必须封装在根标记中。
  • 非空标记必须由“开始标记”与“结束标记”构成。
  • XML 文件的标记必须形成树形结构,即标记不允许出现交叉。
  • 空标记没有“开始标记”和“结束标记”

XML 声明

一个规范的 XML 文件应当以 XML 声明作为文件的第 1 行,在其前面不能有空白、其他处理指令或注释。如:

还可以添加属性:standalone,指为 yes 或 no,表明 XML 文件是否是完全自包含的,即是否引用了外部“实体”。

标记

一个标记包含的内容由两部分构成:文本数据部分和子标记部分。一个标记包含的文本数据部分可以有普通字符、CDATA 段和实体引用。
根标记:每个 XML 文件有且仅有一个根标记,其他标记都必须封装在根标记中。
空标记:即不包含子标记或文本内容的标记,如:
非空标记:...
标记命名规则:可以由字母、数字、下划线、点或连字符组成,但必须以字母或下划线开头。标记名称区分大小写。

属性

属性指标记的附加信息,命名规则与标记相同,且区分大小写。属性不体现数据结构,不要因属性的频繁使用破坏 XML 的数据结构。

特殊字符

&lt;  <
&gt;  >
&apos;  '
&quot;  "
&amp;   &

CDATA 段
CDATA 段中的内容可以包含任意的字符。但 CDATA 段不能相互嵌套,如:

<![CDATA[
boolean boo=true&&false
<三国演义>
]]>

注释

<!--与HTML文件相同—>

注释不可以在 XML 声明的前面。

名称空间

XML 允许自定义标记,那么不同的 XML 文件以及同一 XML 文件就可能出现名字相同的标记。想要区分这些标记,就需要使用名称空间。
有前缀的名称空间语法如下:
xmlns:前缀=名称空间的名字,如 xmlns:person="China.dalian"
无前缀的名称空间语法如下:
xmlns=名称空间的名字,如 xmlns=www.yahoo.com
名称空间的名字决定了相互之间的区分,前缀只是为了方便标记引用。
名称空间的作用域是声明该命名空间的标记及其所有子孙标记。尽管子标记可以通过名称空间的前缀来引用父标记声明名称空间,表明自己隶属于该名称空间,但子标记也可以重新声明名称空间,如:

<?xml version="1.0" encoding="UTF-8" ?>
<people xmlns="public.of.china">
 <p1:Lisi xmlnsp1="Liaoning">
  在建筑公司担任工程师
  <usa:Lichuguo xmlns:usa="American">
   在美国学医英语
  </usa:Lichuguo>
 </p1:Lisi>
 <Zhangsan xmlns="Shanghai">
  在上海中心医院医师
  <Zhangchuguo xmlns="France">
   在法国学习法语
  </Zhangchuguo>
 </Zhangsan>
</people>

名称空间的名字

W3C 推荐使用统一资源标识符(Uniform Resource Identifier, URI)作为名称空间的名字。在 XML 中,URI 不必是有效的,仅仅用作名称空间的名字,往往使用 URL 作为 URI。

有效的 XML 文件

规范的 XML 表示合乎 XML 文件语法,有效的 XML 文件表示组织符合需要的逻辑。
对 XML 的数据结构进行约束的方式有两种:使用文档类型定义(Document Type Definition,DTD)和 XML Schema 模式。
一个规范的 XML 文件如果和某个 DTD 文件相关联,并且遵守该 DTD 文件规定的约束条件,就称之为有效的 XML 文件。

DTD 文件

在 DTD 文件中,用关键字 ELEMENT 来定义一个元素,格式如下:

DTD 文件的扩展名必须是“.dtd”,保存时所选择的编码必须与其关联的 XML 文件一致。

<!ELEMENT 手机用户表 (用户*)>
<!ELEMENT 用户 (号码,姓名)>
<!ELEMENT 号码 (#PCDATA)>
<!ELEMENT 姓名 (#PCDATA)>

在 XML 文件中使用“文档类型声明”与一个 DTD 文件相关联。有两种形式的关联:SYSTEM 和 PUBLIC,SYSTEM 关联表明所关联的 DTD 文件由个人或工作小组所定义且认可,PUBLIC 关联表明所关联的 DTD 文件已经得到某一领域的认可,是经过许多人讨论得到认可的 DTD 文件:

<!DOCTYPE 根标记名称 SYSTEM "DTD文件的URI">
<!DOCTYPE 根标记名称 PUBLIC "正式公用标识符" "DTD文件的URI">

URI 如果是一个文件的名字,该文件必须和当前 XML 文件在同一目录中;如果 URI 是一个 URL,该 URL 必须是可以访问的。
DTD 文档类型声明应该写在 XML 声明的后面。

约束标记的子标记

标记的约束条件是用小括号括起来的子标记列表,子标记列表可以约束 XML 文件中的标记可以包含哪些子标记以及这些子标记出现的先后顺序。
子标记列表中的每个子标记可以尾加模式限定符来限定该子标记出现的次数,不加限定符的子标记必须出现且只能出现一次。限定符有一下三种:

  • +:必须出现一次或多次
  • *:可以出现零次或多次
  • ?:可以出现零次或一次

子标记列表的分项也可以是几个标记的“或运算”,并用括号括起来,如:
约束(#PCDATA)表示文本数据,可以单独使用,也可以与子标记或运算使用,但与子标记或运算时,限定符必须为*
约束 EMPTY 表示标记是一个空标记,或者只能包含有空字符的非空标记。
约束 ANY 表示不准备对该标记有任何约束

DTD 的完整性
即满足以下两个条件:

  1. 不允许无穷嵌套
  2. XML 文件中的每个标记都必须在 DTD 中有相应元素对其进行约束

DTD 中的属性约束列表

格式如下:

<!ATTLIST 标记名称
   属性名称 属性类型 默认值
   属性名称 属性类型 默认值
   ......
>

其中,默认值有如下几种情况:

  • 字符串:标记必须有该属性,且有默认值
  • #IMPLIED:标记可以没有该属性,没有默认值
  • #REQUIRED:标记必须有该属性,没有默认值
  • #FIXED:标记可以没有改属性,但是如果有该属性,那么属性指固定不变

常用属性类型如下:

  • CDATA:属性值可以为任意字符串,但不能包含左右尖括号、与符号、单双引号。如果想用这些字符,可以使用实体引用。
  • Enumerated:属性值只可以使枚举值,其并非关键字,而是用小括号括起来,使用竖线分隔的枚举值组。
  • NMTOKEN:属性值可以由字母、数字、下划线、点或连字符组成,属性值中不能含有空格,可以用数字、点或连字符开头。
  • NMTOKENS:即用空格分隔的多个 NMTOKEN 值
  • ID:如果希望某个属性的属性值具有专用性,即不允许其他类型相同的属性再取这个属性值,就可以将属性的类型取为 ID 类型。可以由字母、数字、下划线、点或连字符组成,但必须以字母或下划线开头。其默认值必须为#REQUIRED 或#IMPLIED。
  • IDREF:属性值为已有的某个 ID 类型的属性的值
  • IDREFS:属性值为若干个其他 ID 类型的属性值的组合,可以用空格分隔。

内部 DTD

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 列车时刻表 [
 <!ELEMENT 列车时刻表 (T28次,T226次)>
 <!ELEMENT T28次 (开车时间,终到时间)>
 <!ELEMENT T266次 (开车时间,终到时间)>
 <!ELEMENT 开车时间 (hour,minute)>
 <!ELEMENT 终到时间 (hour,minute)>
 <!ELEMENT hour (#PCDATA)>
 <!ELEMENT minute (#PCDATA)>
]>
<列车时刻表>
 <T28次>
  <开车时间>
   <hour>21点</hour>
   <minute>12分</minute>
  </开车时间>
  <终到时间>
   <hour>23点</hour>
   <minute>25分</minute>
  </终到时间>
 </T28次>
 <T226次>
  <开车时间>
   <hour>08点</hour>
   <minute>45分</minute>
  </开车时间>
  <终到时间>
  <hour>19点</hour>
  <minute>36分</minute>
  </终到时间>
 </T28次>
</列车时刻表>

DTD 调试

IGNORE:忽略某些约束条件
<![ IGNORE [
DTD中的某些约束条件
]]>
INCLUDE:包含某些约束条件
<![INCLUDE [
DTD中的某些约束条件
]]>

DTD 与命名空间

如果有效的 XML 文件中的标记想定义名称空间,那么必须保证 DTD 中有相应的约束。格式如下:

如:

<!ATTLIST ya:张三 xmlns:ya CDATA #FIXED "www.yahoo.com">

名称空间的目的是有效的区分名字相同的标记,否则不允许对一个标记约束两次。

XML 关联 CSS

<?xml-stylesheet href="样式表的URI" type="text/css" ?>
  • XML
    28 引用 • 59 回帖
  • 教程
    140 引用 • 541 回帖 • 8 关注
  • 阅读
    77 引用 • 236 回帖 • 4 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • ZephyrJung

    我好像搞出来了两篇一样的。。
    事情的经过是这样的:我编辑完后发现有问题,于是更新,但是不小心点了个取消发布,然后草稿箱里出现了两条一样的
    我点进去了其中一个进行编辑发布,另一个还在草稿箱里。然而我同步到黑客派上的文章却并没有更新,似乎是和草稿箱的保持一致了
    于是我删除了草稿箱的那篇,并点进黑客派的这篇,编辑了一下,与 blog 上的一致
    结果就出现了两篇
    @88250

    1 回复
  • 88250

    收到,这估计是个很深的坑,多谢反馈,等有空我会尽力修复的。

ZephyrJung
一切有为法,如梦幻泡影,如露亦如电,应作如是观 北京

推荐标签 标签

  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖 • 1 关注
  • PWL

    组织简介

    用爱发电 (Programming With Love) 是一个以开源精神为核心的民间开源爱好者技术组织,“用爱发电”象征开源与贡献精神,加入组织,代表你将遵守组织的“个人开源爱好者”的各项条款。申请加入:用爱发电组织邀请帖
    用爱发电组织官网:https://programmingwithlove.stackoverflow.wiki/

    用爱发电组织的核心驱动力:

    • 遵守开源守则,体现开源&贡献精神:以分享为目的,拒绝非法牟利。
    • 自我保护:使用适当的 License 保护自己的原创作品。
    • 尊重他人:不以各种理由、各种漏洞进行未经允许的抄袭、散播、洩露;以礼相待,尊重所有对社区做出贡献的开发者;通过他人的分享习得知识,要留下足迹,表示感谢。
    • 热爱编程、热爱学习:加入组织,热爱编程是首当其要的。我们欢迎热爱讨论、分享、提问的朋友,也同样欢迎默默成就的朋友。
    • 倾听:正确并恳切对待、处理问题与建议,及时修复开源项目的 Bug ,及时与反馈者沟通。不抬杠、不无视、不辱骂。
    • 平视:不诋毁、轻视、嘲讽其他开发者,主动提出建议、施以帮助,以和谐为本。只要他人肯努力,你也可能会被昔日小看的人所超越,所以请保持谦虚。
    • 乐观且活跃:你的努力决定了你的高度。不要放弃,多年后回头俯瞰,才会发现自己已经成就往日所仰望的水平。积极地将项目开源,帮助他人学习、改进,自己也会获得相应的提升、成就与成就感。
    1 引用 • 487 回帖
  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 94 关注
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖 • 5 关注
  • Wide

    Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。

    欢迎访问我们运维的实例: https://wide.b3log.org

    30 引用 • 218 回帖 • 615 关注
  • flomo

    flomo 是新一代 「卡片笔记」 ,专注在碎片化时代,促进你的记录,帮你积累更多知识资产。

    4 引用 • 91 回帖
  • 以太坊

    以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统。以太坊是一个平台和一种编程语言 Solidity,使开发人员能够建立和发布下一代去中心化应用。 以太坊可以用来编程、分散、担保和交易任何事物:投票、域名、金融交易所、众筹、公司管理、合同和知识产权等等。

    34 引用 • 367 回帖 • 2 关注
  • webpack

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    41 引用 • 130 回帖 • 283 关注
  • frp

    frp 是一个可用于内网穿透的高性能的反向代理应用,支持 TCP、UDP、 HTTP 和 HTTPS 协议。

    16 引用 • 7 回帖 • 2 关注
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    7018 引用 • 31717 回帖 • 219 关注
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖 • 1 关注
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    106 引用 • 152 回帖
  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 321 关注
  • Latke

    Latke 是一款以 JSON 为主的 Java Web 框架。

    70 引用 • 533 回帖 • 734 关注
  • IPFS

    IPFS(InterPlanetary File System,星际文件系统)是永久的、去中心化保存和共享文件的方法,这是一种内容可寻址、版本化、点对点超媒体的分布式协议。请浏览 IPFS 入门笔记了解更多细节。

    20 引用 • 245 回帖 • 239 关注
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 404 关注
  • Scala

    Scala 是一门多范式的编程语言,集成面向对象编程和函数式编程的各种特性。

    13 引用 • 11 回帖 • 110 关注
  • Markdown

    Markdown 是一种轻量级标记语言,用户可使用纯文本编辑器来排版文档,最终通过 Markdown 引擎将文档转换为所需格式(比如 HTML、PDF 等)。

    165 引用 • 1474 回帖
  • Solo

    Solo 是一款小而美的开源博客系统,专为程序员设计。Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    1427 引用 • 10046 回帖 • 473 关注
  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 196 关注
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    186 引用 • 318 回帖 • 330 关注
  • Kafka

    Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是现代系统中许多功能的基础。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。

    35 引用 • 35 回帖
  • 旅游

    希望你我能在旅途中找到人生的下一站。

    86 引用 • 897 回帖 • 1 关注
  • 服务器

    服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

    124 引用 • 580 回帖
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖
  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 141 关注
  • WebClipper

    Web Clipper 是一款浏览器剪藏扩展,它可以帮助你把网页内容剪藏到本地。

    3 引用 • 9 回帖 • 3 关注