XML规范 - 中文版(2)

2019-04-22 08:30

字符引用和处理指令组成,所有这些都在文件中用显式标记指明。逻辑和物理结构必须 如\规范的已析实体\中所描述那样严格地嵌套。

2.1 规范的XML文件(Well-Formed XML Documents) 一个文本对象是一个规范的XML文件如果它满足: 作为一个整体,它匹配document产生式。 它满足本规范中定义的所有规范性约束。

此文件中直接或间接引用的每一个已析实体都是规范的。 文件

[1]document ::= prolog element Misc* 匹配document产生式意味着: 它包含一个或多个元素

有且仅有一个称为根(root)或文件元素的元素,它不出现在其他任何元素的内容(content)中。对于其他所有元素,如果起始标签在另一个元素的内容 中,则其结束标签也在同一元素的内容中。换一个更简单的说法,以起始标签和结束标签为界的各个元素,必须严格地嵌套。

这样做的结果是,对于每一个非根的元素C,文件中另有一个元素P,C在P的内容中,而不在其他任何被P所包含的元素的内容中。P被称为C的父元素(parent),而C被称为P的子元素(child)。

2.2 字符

一 个已析实体包含文本(text),文本是一个字符(character)序列,可以表示标记或字符数据。一个字符是ISO/IEC 10646[ISO /IEC 10646]中定义的文本最小单元。合法的字符包括制表符,回车,换行以及Unicode和ISO/IEC 10646中定义的合法的图形字符。不提倡使用[Unicode]6.8节中定义的\兼容字符(compatibility characters)\。

字符范围

[2] Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* 除 了替代块(surrogate block),FFFE和FFFF以外的任意Unicode字符。*/

将字符代码编码成位模型的机制各个实体间可能会有所不同。所有的XML处理器必须接受10646中的UTF-8和UTF-16编码;用于指出所用编码或指定使用其他编码的机制在后面的\实体中的字符编码\中讨论。

2.3 通用语法成分

本节中定义了一些在文法中广泛使用的符号。

S(空白)包括一个或多个空格字符(#x20),回车,换行和制表符。 空白

[3] S ::= (#x20 | #x9 | #xD | #xA)+

为方便起见,字符被分为字母,数字和其他字符三类。字母可以是字母表中的字母,或是一个音节基字符(syllabic base character)后跟一个或多个组合字符,也可以是一个表意字符。在\字符的分类\中给出了每一类字符的完整定义。

名字(name)是以字母或某些标点符号开头的记号,后跟字母,数字,连字符,下划线,冒号或句号,这些符号统称为命名字符 (name character)。以\或其他任何匹配 (('X'|'x') ('M'|'m') ('L'|'l')) 的字符串开头的名字,被保留用于本规范的此版本或后续版本的标准化。

注意:XML名字中的冒号被保留用于名字空间(name space)实验。它的含义有待于日后标准化,那时那些将冒号用于实验目的的文件有可能需要更新。(不保证XML采用的任何名字空间机制会实际采用冒号作为定界符。)实际上,这意 味着除非用于名字空间实验,XML文件作者不应该在XML名字中使用冒号,但XML处理器应该接受冒号作为一个命名字符。

Nmtoken(名字记号,name token)是任何命名字符的混合体。 名字和记号

[4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' | CombiningChar | Extender [5] Name ::= (Letter | '_' | ':') (NameChar)* [6] Names ::= Name (S Name)* [7] Nmtoken ::= (NameChar)+

[8] Nmtokens ::= Nmtoken (S Nmtoken)*

常量数据是任何用引号括起的字符串,不包括用作定界符的引号。常量用于指明内部实体的内容(EntityValue),属性值(AttValue),以及外部标识符(SystemLiteral)。注意,对SystemLiteral的语法分析可以不扫描标记。

常量

[9] EntityValue ::= '\ | \[10] AttValue ::= '\ | \

[11] SystemLiteral ::= ('\

[12] PubidLiteral ::= '\

[13] PubidChar ::= #x20 | #xD | #xA | [a-zA-Z0-9] | [-'()+,./:=?;!*#@$_%] 2.4 字符数据和标记

文本由字符数据和标记混合构成。标记包括起始标签,结束标签,空元素标签,实体引用,字符引用,注释,CDATA段定界符,文件类型声明和处理指令。

其他所有非标记的文本组成文件的字符数据。

\号(&)和左尖括号(<)只有作为标记定界符,或在注释,处理指令,或CDATA段中时才能以常量形式出现。它们在一个内部实体声明的常量 实体数值中也是合法的,参见\规范的已析实体\。如果在其他地方需要用到这两个字符,它们必须用数值式字符引用来转义或分别用字符 串\和\表示。右尖括号(>)可以用\表示,而当它在内容中的字符串\中出现,但此字符串不表示一个 CDATA段的结束时,出于兼容性考虑,必须用\或一个字符引用转义得到。

在一个元素的内容中,字符数据可以是不包括任何标记的起始定界符的任意字符串。在一个CDATA段中,字符数据可以是不包括CDATA段结束定界符\的任意字符串。

为了允许在属性值中包含单引号和双引号,省略符或称单引号(')可以被表示为\,而双引号(\可以被表示为\。

字符数据

[14] CharData ::= [^<&]* - ([^<&]* '}>' [^<&]*) 2.5 注释

注释可以在其他标记之外的文件中的任何位置出现。另外,它们可以在文件类型声明中文法允许的地方出现。它们不是文件字符数据的一部分,XML处理器可以,但不是必须,允许一个应用检索注释文本。出于兼容性考虑,字符串\双连字符)不能在注释中出现。

注释

[15] Comment ::= '' 注释的一个例子:

2.6 处理指令

处理指令(PI)允许文件中包含由应用来处理的指令。 处理指令

[16] PI ::= '' Char*)))? '?>' [17] PITarget ::= Name - (('X' | 'x') ('M' | 'm') ('L' | 'l'))

PI不是文件字符数据的一部分,但必须传递给应用。PI以用于指示传递给哪个应用的目标(PITarget)开头,目标名字\,\,等等,保留用于本规范的此版本或后续版本的标准化。XML记法机制可以用于PI目标的形式化声明。

2.7 CDATA段

CDATA段可以出现在字符数据可以出现的任何地方,它们用于转义包含会被识别为标记的字符串的文本块。CDATA段以字符串\开始,以字符串\结束:

CDATA段

[18] CDSect ::= CDStart CData CDEnd [19] CDStart ::= '

[20] CData ::= (Char* - (Char* '}>' Char*)) [21] CDEnd ::= '}>'

在一个CDATA段内,只有CDEnd字符串被识别为标记,因此左尖括号和\可以以它们的常量形式出现,不需要(也不能)被换码为\和\。CDATA段不能嵌套。

一个CDATA段的例子,其中\和\被识别为字符数据,而不是标记: Hello, world!}> 2.8 序(prolog)和文件类型声明

XML文件可以,也应该以一个XML声明开始,其中指明了所用XML的版本。 例如,以下是一个完整的XML文件,它是规范的,但不是有效的:

Hello, world!

下面这个也同样:

Hello, world!

版本号\应该用于表明对与规范此版本相一致,如果使用了值\但又与本规范的此版本不一致,那么这是文件的一个错误。XML工作组打算赋予本规范的后续版本不同于\的数值,但这并不代表开发后续版本的承诺,也不代表如果有后续版本,会使用任何特殊的命名方案的承诺。因为不排除有后续版 本的可能性,提供了本构造(construct)作为一旦需要时进行自动版本识别的手段。当处理器收到的文件标有它们不支持的版本时,可以给出一个错误。

XML文件中标记的功能是描述文件的存储格式和逻辑结构,并将属性-值对和逻辑结构关联起来。XML提供一种称为文件类型声明的机制, 用于定义对逻辑结构的约束,支持预定义存储单元的使用。如果一个XML文件有相应的文件类型声明并且它遵循其中的约束,则称它是有效的(valid)。

文件类型声明必须位于文件第一个元素之前。 序

[22] prolog ::= XMLDecl? Misc* (doctypedecl Misc*)?

[23] XMLDecl ::= '' [24] VersionInfo ::= S 'version' Eq (' VersionNum ' | \[25] Eq ::= S? '=' S?

[26] VersionNum ::= ([a-zA-Z0-9_.:] | '-')+ [27] Misc ::= Comment | PI | S

XML 文件类型声明包含或指向标记声明,标记声明提供某一类文件的文法。这种文法被称为文件类型定义 (document type difinition,DTD)。文件类型定义可以指向一个外部子集(一种特殊类型的外部实体),或者可以在一个内部子集 中直接包含标记声明,或者两者兼用。一个文件的文件类型定义由这两个子集合在一起组成。

标记声明可以是元素类型声明,属性表声明,实体声明,或是记法声明。这些声明可以如下面规范性和有效性约束中所述,全部或部分地包含在参数实体中,完整的信息参见\物理结构\。

文件类型定义

[28] doctypedecl ::= '& lt;!DOCTYPE' S Name (S ExternalID)? S? ('[' (markupdecl | PEReference | S)* ']' S?)? '>' [ VC:根 元素类型 ]

[29] markupdecl ::= elementdecl | AttlistDecl | EntityDecl | NotationDecl | PI | Comment [ VC:严格的声明/PE嵌套 ]

[ WFC:内部子集中的PE ]

标记声明可以全部或部分地由参数实体的置换文本组成。本规范后面的各个非终结符(elementdecl,AttlistDecl,等等)产生式描述的是在所有的参数实体被包含(include)之后的声明。

有效性约束:根元素类型(Root Element Type) 文件类型声明中的Name必须匹配根元素的类型。 有效性约束:严格的声明/PE嵌套

参数实体的置换文本必须用标记声明严格嵌套。即,如果一个标记声明(上面的markupdecl)的第一个或最后

一个字符被包含于一个参数实体引用的置换文本中,两者必须都在此置换文本中。

规范性约束:内部子集中的PE

在内部DTD子集中,参数实体引用只能出现在标记声明可以出现的地方,而不能在标记声明内部出现。(这个约束不适用于出现在外部参数实体内的引用,也不适用于外部子集。)

同 内部子集一样,外部子集和任何DTD中引用的外部参数实体,必须由一系列被非终结符markupdecl所允许的完整的标记声明组成,其中可以夹杂空白字 符或参数实体引用。但是,外部子集和外部参数实体的部分内容可以通过使用条件段(conditional section)被有条件地忽略,在内部子集中 则不允许这么做。

外部子集

[30] extSubset ::= TextDecl? extSubsetDecl

[31] extSubsetDecl ::= ( markupdecl | conditionalSect | PEReference | S )*

外部子集和外部参数实体与内部实体不同之处还在于:在它们内,参数实体引用不仅可以出现在标记声明间,还可以出现在标记声明内。

有文件类型声明的XML文件的例子:

Hello, world!

系统标识符\给出了文件DTD的URI。 声明也可以如同下面这个例子一样直接(locally)给出:

]>

Hello, world!

如果同时使用外部和内部子集,内部子集被看成出现在外部子集之前,这意味着内部子集中的实体和属性表声明的优先级要比在外部子集中的高。

2.9 独立文件声明

当文件从XML处理器递给应用时,标记声明可以影响它的内容,属性缺省值和实体声明是其中的例子。可以作为XML声明成分的独立文件声明,指明了对于文件实体而言,是否存在外部的声明。

独立文件声明

[32] SDDecl ::= S 'standalone' Eq ((\:独立文件声明 ]

在一个独立文件声明中,值\表示对于文件实体没有外部标记声明(不论是在DTD外部子集中,还是在由内部实体引用的外部参数实体中)会影响从XML 处理器传递给应用的信息。值\表示有或可能有这样的外部标记声明。注意独立文件声明只是表示外部声明的存在,如果文件中存在对外部实体的引用,而这 些实体已在内部声明时,不影响它的独立状态。

如果不存在外部标记声明,独立文件声明没有意义。如果存在外部标记声明,但没有独立文件声明,就假


XML规范 - 中文版(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:威斯敏斯特小要理问答

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: