示例
标记语法
- XML标记负责提供和描述一个XML文件或数据包的内容结构。它们由界定内容的不同部分的标记(tag)组成,负责提供到特殊符号和文本宏的引用,或者将特殊指令传递给应用软件,以及把注释传递给文档编辑器
- XML元素的结构与HTML基本相同,XML也同样使用尖括号来界定标记—以小于号(<)起始、大于号(>)结尾。但二者的相同点也就仅此而已
- 与HTML不同,几乎所有的XML标记都是大小写敏感的,其中包括元素的标记名和属性值
- 字符:XML指定的字符均在16位的Unicode 2.1字符集中定义
- 命名:所有XML命名都必需以字母、下划线( _)或冒号(:)开头,后面跟着的是有效命名字符。有效命名字符除了前面的内容,还包括数字、连字符(-)、句点(.)。在实际应用当中不应该使用冒号, 除非是用作命名空间的分隔符
- 不能由字符串“ xml”、“XML”或任何以此顺序排列的这三个字母的各类组合(例如“ xML”或“Xml”)开头
文档部分
一个格式正规的XML文档由三个部分组成:
- 一个可选的序言
- 文档的主体
- 可选的尾声
元素
- 元素是XML标记的基本组成部分,可以包含其他的元素、字符数据、字符引用、实体引用、PI、注释和/或CDATA部分—这些合在一起被称作元素内容
- 所有的XML数据(除了注释、PI和空白)都必须包容在其他元素中
- 元素使用标记(tag)进行分隔
- 起始标记:一个元素开始的分隔符被称作起始标记
- 结束标记:一个元素最后的分隔符被称作结束标记
- 空元素标记 空元素可能不包含任何内容
<point1></point1>
<point1/>
- 标记:一个简单的例子
- 文档元素
格式正规的XML文档的定义形式是一个简单的层次树, 每个文档都有一个,而且只有一个根节点,它被称作文档实体( document entity)或文档根( document root) - 子元素
- XML文档中其他所有元素都是文档元素的后代
- 任何元素类型只能包含四种内容中的一种。
- 包含元素内容
- 包含混合内容
- 字符内容
- 空元素
- 元素嵌套
- XML对元素有一种非常重要的要求—它们必须正确地嵌套。
- 示例:
- 在元素结构的问题上, HTML和许多字处理格式几乎都没有XML那么严格的要求
字符串
- 字符串(string literal)主要用在属性值、内部实体和外部标识符中。
- XML 使用单引号(’)或双引号(")作为一对分隔符将其中的字符串包围起来。
- 合法的字符串表述,示例:
- 不合法的字符串表述
字符数据
- 字符数据就是任何不是标记的文本,它是元素或属性值的文本内容。
- 小于号和&符号是标记分隔符,因此它们绝不能以字符串的形式出现在字符数据中
- 如果这些字符是字符数据所必需的,它们必需使用实体引用& 或< ;来代替。
属性
- 如果说元素是XML中名词,那么属性就是这种语言的形容词。
- 将某些信息附着在元素上,它们与元素本身包含的信息内容有所不同。属性( attribute)都包括一个名称-值组合,使用的格式有如下两种形式:
- 在起始标记或空标记中属性只允许有一个实例存在。
- 如果希望给每个运送书本的纸箱编上一个号码的话,可以使用如下属性:
特殊属性
- 在XML 1.0推荐标准中定义了两个特殊的属性: xml:space和xml:lang
- XML文档的作者可以使用这些属性向XML应用程序(例如,浏览器)传递某种信号
空白
- 在XML数据中,只有4个字符可以作为空白使用
- XML处理空白的规则非常简单:解析器会保留内容中所有的空白字符并不加修改地传递给应用程序,但元素标记和属性值中的空白会被删除
- 行尾的处理: XML解析器需要将所有的行尾字符串转换为单个LF(换行)字符
字符引用和实体引用
- 字符引用:字符引用是一个字符文字形式的替代品,当对该字符的文字形式直接处理会导致违反XML对格式正规的要求时,它会起到非常重要的作用。
- 字符引用用来表示一个可显示的字符,它由十进制或十六进制的数字前面加上“ &#”或“&#x”, 后面紧跟分号(;)组成:
- 实体引用:实体引用允许在元素内容或属性值中插入任何字符串,这就为字符引用提供了一种助记的替代方式。
- 实体引用是一种合法的XML名字,前面带有一个符号“&”,后面跟着一个分号( ;):&name;
- 有五个实体被定义为XML的固有部分,它们通常用作XML标记分隔符号的转义序列
处理指令
- 当需要把某些线索通过文档传递给应用程序时, XML采用处理指令(Processing Instruction,PI)为此目的提供了一种机制。
- PI使用的是XML元素语法的一种变形:
- 处理指令target是必须的部分,而且必须是有效的XML名 称,它用来指明哪个应用程序(或者其他对象)需要PI的帮助。PI的… instruction …部分只不过是一个字符串表示, 它可能包含任何有效的字符,除了“ ? >”(因为这是PI的结束符)
注释
- 注释可能提供修订记录、历史信息或者其他类型的可能对创建者或者文档编辑者来说有着特殊意义但又不是真正的文档内容的元数据。注释可能出现在文档中除其他标记部分以外的任何地方
- XML注释的基本语法是:
- XML 1.0规范允许,但并不要求XML处理器为应用程序提供一种方法来获取注释的文本。因此, XML应用程序永远不能依靠使用注释来传输特殊指令
- 示例
CDATA部分
- CDATA部分是一种用来包含文本的方法,其对象是那些其中的字符如果不如此处理就会被识别为标记的文本。
- 只要有字符数据出现的地方就可能出现CDATA 部分,但它们不能够嵌套。在CDATA部分中唯一能够被识别的标记字符串就是它的结束分隔符(“] ] >”)。
- CDATA部分的基本语法如下:
文档结构
- 序言
- 序言的组成包括:一个可选的XML声明,可能紧跟着几个(或者没有)注释、处理指令、空白字符,其后可能有一个可选的文档类型声明(再带着几个可选的注释、处理指令和空白字符)。
- XML声明
- 所有的XML文档可能由一个XML声明(XML Declaration)开始。
- 下面的例子是一个XML声明的完整语法(包括可选的属性encoding和standalone):
- 与大多数XML属性不同,这些必须按上面的顺序依次出现。另一方面,也是与大多数XML属性不同,encoding属性值不是大小写敏感的
- 文档类型声明
- 所有有效的XML文档必需包含这个声明,但简单的格式正规的文档并不需要这样的包含关系,而且它们也不包含(除了5个标准XML实体)任何实体引用。
- 外部子集引用
- 内部子集声明
- XML尾声可能包含注释、PI和/或空白。
小结
- XML标记的形式
- 特殊的XML指令和声明
- XML实体引用
格式正规的文档
- 所有遵守XML语法规范的数据对象(文档)都是格式正规的XML文档。这类文档在使用时可以不使用DTD或模式来描述它们的结构,它们也被称作独立的( standalone)XML文档。这些文档不能够依靠外部的声明,属性值只能是没有经过特殊处理的值或缺省值
- 一个格式正规的XML文档包含一个或多个元素(用起始和结束标记分隔开),它们相互之间正确地嵌套。其中有一个元素,即文档元素,包含了文档中其他所有元素。所有的元素构成一个简单的层次树,所以元素和元素之间唯一的直接关系就是父子关系。兄弟关系经常能够通过XML应用程序内部的数据结构推断出来,但这些既不直接,也不可靠(因为元素可能被插入到某个元素和它的一个或多个子元素之间)。文档内容可能包括标记和/或字符数据
- 数据对象如果满足下列条件就是格式正规的文档:
- 语法合乎XML规范
- 元素构成一个层次树,只有一个根节点
- 没有对外部实体的引用,除非提供了DTD
解析器
- 目前,有两种类型的解析器:
- 非验证的( non-validating)—解析器仅仅保证数据对象是格式正规的XML
- 验证的(Validating)—解析器使用DTD保证格式正规 的数据对象的形式和内容的有效性
- 事件驱动的解析器
- XML解析器为每类XML数据执行到应用程序的回调:元素(及其属性)、字符数据、处理指令、符号或者注释。
- 事件驱动的办法对系统资源的需求及其普通,即使对于非常大的文档也是如此
- 基于树的解析器
- 使用这种方法的XML解析器通常遵守W3C的文档对象模型(Document Object Model,DOM)。DOM是一种独立于平台、语言的接口,它能够对树结构的文档进行操作。另一方面, DOM树在文档能够被操作之前必需在内存中生成—所以高性能的虚拟内存支持对于大型文档来说是非常必要的。一旦树被生成,应用程序就可以通过相关的API访问DOM。