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

本贴最后更新于 2724 天前,其中的信息可能已经时异事殊

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" ?>
  • 笔记

    好记性不如烂笔头。

    304 引用 • 777 回帖
  • 教程
    139 引用 • 495 回帖 • 7 关注
  • XML
    28 引用 • 59 回帖

相关帖子

欢迎来到这里!

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

注册 关于
请输入回帖内容 ...
ZephyrJung
一切有为法,如梦幻泡影,如露亦如电,应作如是观 北京

推荐标签 标签

  • sts
    2 引用 • 2 回帖 • 149 关注
  • 反馈

    Communication channel for makers and users.

    123 引用 • 906 回帖 • 193 关注
  • 智能合约

    智能合约(Smart contract)是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于 1994 年由 Nick Szabo 首次提出。

    1 引用 • 11 回帖 • 6 关注
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    108 引用 • 54 回帖
  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    18728 引用 • 69951 回帖
  • C++

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

    106 引用 • 152 回帖
  • 音乐

    你听到信仰的声音了么?

    59 引用 • 509 回帖
  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    523 引用 • 4581 回帖 • 690 关注
  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    51 引用 • 226 回帖 • 1 关注
  • 资讯

    资讯是用户因为及时地获得它并利用它而能够在相对短的时间内给自己带来价值的信息,资讯有时效性和地域性。

    53 引用 • 85 回帖
  • danl
    64 关注
  • 大数据

    大数据(big data)是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

    89 引用 • 113 回帖
  • CodeMirror
    1 引用 • 2 回帖 • 121 关注
  • Postman

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

    4 引用 • 3 回帖
  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 561 关注
  • Wide

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

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

    30 引用 • 218 回帖 • 605 关注
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 352 关注
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 549 关注
  • Hadoop

    Hadoop 是由 Apache 基金会所开发的一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

    82 引用 • 122 回帖 • 619 关注
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    69 引用 • 190 回帖 • 497 关注
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1083 引用 • 3461 回帖 • 285 关注
  • 笔记

    好记性不如烂笔头。

    304 引用 • 777 回帖
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 511 关注
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    28 引用 • 108 回帖 • 1 关注
  • 招聘

    哪里都缺人,哪里都不缺人。

    189 引用 • 1056 回帖
  • PostgreSQL

    PostgreSQL 是一款功能强大的企业级数据库系统,在 BSD 开源许可证下发布。

    22 引用 • 22 回帖
  • RYMCU

    RYMCU 致力于打造一个即严谨又活泼、专业又不失有趣,为数百万人服务的开源嵌入式知识学习交流平台。

    4 引用 • 6 回帖 • 41 关注