|
2. 文件 2.1 格式正确的 XML 文件 2.2 字符 2.3 通用语法成分 2.4 字符数据和标记 2.5 注释 2.6 处理指令 2.7 CDATA 段 2.8 序言和文件类型声明 2.9 独立文件声明 2.10 空白处理 2.11 行尾处理 2.12 语言标识
[定义:如果一个数据对象满足本规范中格式正确的之定义时,它是一个 XML 文件。一个格式正确的 XML 文件可以更进一步是有效的,如果它满足某些进一步的约束的话。]
每一个 XML 文件都有逻辑和物理结构。物理上而言,文件由称为实体的单元组成。一个实体可以引用(refer)其他实体,将它们包含在文件中。文件开始于"根(root)"或文件实体。逻辑上而言,文件由声明,元素,注释,字符引用和处理指令组成,所有这些都在文件中用显式标记指明。逻辑和物理结构必须如"4.3.2 格式正确的已析实体"中所描述的那样严格地嵌套。
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](或 [ISO/IEC 10646-2000])中定义的文本最小单元。合法的字符包括制表符,回车,换行以及 Unicode 和 ISO/IEC 10646 中定义的合法字符。在制定本文档时,在附录 A.1 正式参考文献中引用的标准都是当时的最新版本,在这些标准的增补版或新版中可能会加入新的字符。因此,XML 处理器必须能接受产生式 Char 中所定义范围内的任意字符。不提倡使用 [Unicode] 6.8 节(或 [Unicode3] 3.6 节 D21 )中定义的"兼容字符(compatibility characters)"。]
字符范围
[2]
Char
::=
#x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
/* 除了代用块(surrogate block),FFFE 和 FFFF 以外的任意 Unicode 字符。*/
将字符代码编码成位模式的机制各个实体间可能会有所不同。所有的 XML 处理器必须接受 10646 中的 UTF-8 和 UTF-16 编码;用于指出所用编码或指定使用其他编码的机制在后面的"4.3.3 实体中的字符编码"中讨论。
2.3 通用语法成分
本节中定义了一些在文法中广泛使用的符号。
S(空白)包括一个或多个空格字符(#x20),回车,换行和制表符。
空白
[3]
S
::=
(#x20 | #x9 | #xD | #xA)+
为方便起见,字符被分为字母,数字和其他字符三类。字母可以是字母表中的字母,或是一个音节基字符(syllabic base character),也可以是一个表意字符。在"B. 字符的分类"中给出了每一类字符的完整定义。
[定义:名字(name)是以字母或某些标点符号开头的记号,后跟字母,数字,连字符,下划线,冒号或句号,这些符号统称为命名字符(name character)。] 以 "xml" 或其他任何匹配 (('X'|'x') ('M'|'m') ('L'|'l')) 的字符串开头的名字,被保留用于本规范的此版本或后续版本的标准化。
注:
建议 XML 中的名字空间 [XML Names] 中赋予了包含冒号的名字某种含义。因此除非用于名字空间,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
::=
'"' ([^%&"] | PEReference | Reference)* '"'
| "'" ([^%&'] | PEReference | Reference)* "'"
[10]
AttValue
::=
'"' ([^<&"] | Reference)* '"'
| "'" ([^<&'] | Reference)* "'"
[11]
SystemLiteral
::=
('"' [^"]* '"') | ("'" [^']* "'")
[12]
PubidLiteral
::=
'"' PubidChar* '"' | "'" (PubidChar - "'")* "'"
[13]
PubidChar
::=
#x20 | #xD | #xA | [a-zA-Z0-9] | [-'()+,./:=?;!*#@$_%]
注:
虽然产生式 EntityValue 允许定义只包含单个 < 的实体(如,),但是强烈建议避免这种用法,因为对此实体的任何引用都会引起一个格式正确性错误。
2.4 字符数据和标记
文本由字符数据和标记混合构成。[定义:标记包括起始标签,结束标签,空元素标签,实体引用,字符引用,注释,CDATA 段定界符,文件类型声明,处理指令,XML 声明,文本声明,以及任何在文件实体顶层的空白(即,在文件元素之外且不在任何其他的标记中)。]
[定义:其他所有非标记的文本组成文件的字符数据。]
"and"号(&)和左尖括号(<)只有作为标记定界符,或在注释,处理指令,或 CDATA 段中时才能以常量形式出现。如果在其他地方需要用到这两个字符,它们必须用数值式字符引用来转义或分别用字符串"&"和"<"表示。右尖括号(>)可以用">"表示,而当它在内容中的字符串"]]>"中出现,但此字符串不表示一个 CDATA 段的结束时,出于兼容性考虑,必须用">"或一个字符引用转义得到。
在一个元素的内容中,字符数据可以是不包括任何标记的起始定界符的任意字符串。在一个 CDATA 段中,字符数据可以是不包括 CDATA 段结束定界符"]]>"的任意字符串。
为了允许在属性值中包含单引号和双引号,省略符或称单引号(')可以被表示为"'",而双引号(")可以被表示为"""。
字符数据
[14]
CharData
::=
[^<&]* - ([^<&]* ']]>' [^<&]*)
2.5 注释
[定义:注释可以在其他标记之外的文件中的任何位置出现。另外,它们可以在文件类型声明中文法允许的地方出现。它们不是文件字符数据的一部分,XML 处理器可以,但不是必须,允许一个应用检索注释的文本。出于兼容性考虑,字符串"--"(双连字符)不能在注释中出现。] 注释中的参数实体不被识别。
注释
[15]
Comment
::=
''
注释的一个例子:
注意,此文法不允许注释以 ---> 结尾。下面的例子不是格式正确的。
2.6 处理指令
[定义:处理指令(PI)允许文件中包含由应用来处理的指令。]
处理指令
[16]
PI
::=
'' PITarget (S (Char* - (Char* '?>' Char*)))? '?>'
[17]
PITarget
::=
Name - (('X' | 'x') ('M' | 'm') ('L' | 'l'))
PI 不是文件字符数据的一部分,但必须传递给应用。PI 以用于指示传递给哪个应用的目标(PITarget)开头。目标名字 "XML","xml",等等,保留用于本规范的此版本或后续版本的标准化。XML 记法机制可以用于 PI 目标的形式化声明。参数实体在处理指令中不被识别。
2.7 CDATA 段
[定义:CDATA 段可以出现在字符数据可以出现的任何地方,它们用于转义包含会被识别为标记的字符串的文本块。CDATA 段以字符串 "" 开始,以字符串 "]]>" 结束:]
CDATA 段
[18]
CDSect
::=
CDStart CData CDEnd
[19]
CDStart
::=
'
[20]
CData
::=
(Char* - (Char* ']]>' Char*))
[21]
CDEnd
::=
']]>'
在一个 CDATA 段内,只有 CDEn [1] [2] [3] 下一页
|