computer 版 (精华区)
发信人: lyl (一条四处游荡的鱼), 信区: network
标 题: [范文][XML]W3C建议XML 1.0中文版说明(七) (转载)
发信站: 听涛站 (Fri Apr 28 21:12:37 2000), 转信
发信人: DDG (导弹驱逐舰~雾的季节), 信区: XML
标 题: [范文][XML]W3C建议XML 1.0中文版说明(七) (转载)
发信站: BBS 水木清华站 (Thu Apr 6 13:29:42 2000)
【 以下文字转载自 New_board 讨论区 】
【 原文由 starw 所发表 】
4. 物理结构
一个XML文档可能包含一个或多个存储单元。它们被称为实体(entity);它们都具有
内容并且都用名字(name)进行标识(除了下面要提到的文档实体,和外部DTD子集之
外)。每一个XML文档有一个称为文档实体的实体,它作为XML处理器处理的起点并可
能包含了整个文档。
实体可以是已析的或未析的。已析实体(parsed entity)的内容被称为它的置换文本;
此文本被看成是文档整体的一部分。
未析实体(unparsed entity)是一种资源,其内容可以是也可以不是文本,并且如果
是文本的话,可以不是XML。每一个未析实体有一个相关联的用名字标识的符号。除
了要求XML处理器能向应用提供实体和符号的标识符之外,XML对未析实体的内容不
作任何限制。
已析实体以实体引用的方式使用名字来调用;未析实体用ENTITY或ENTITIES属性中给
出的名字调用。
通用实体(general entity)是那些在文档内容中使用的实体。在本规范中,在不致
引起混淆的情况下,普通实体有时用未修饰的术语entity来表示。参数实体是用于D
TD内的已析实体。这两类实体用不同形式的引用,在不同的上下文中识别。另外,
它们使用不同的名域;具有相同名字的参数实体和通用实体是两个截然不同的两个实
体。
4.1 字符和实体引用(Character and Entity References)
一个字符引用引用ISO/IEC 10646字符集中的一个特定字符。例如一个不能用输入设
备直接输入的字符。
字符引用
[66] CharRef ::= '&#' [0-9]+ ';'
| '&#x' [0-9a-fA-F]+ ';' [ WFC: 合法字符 ]
格式约束: 合法字符
用字符引用引用的字符必须匹配Char产生式。
如果字符引用以"&#x"开头的数字和字母(直到终结)提供了某字符在ISO/IEC 10646
中代码的一个十六进制表示。如果它仅以"&#"开头的数字(直到终结)提供了某字符
的代码的十进值表示。
实体引用(entity reference)引用一个命名实体的内容。对已析普通实体的引用使
用"and"号(&)和分号(;)作为定界符。参数实体引用则使用百分号(%)和分号(;)作为
定界符。
实体引用
[67] Reference ::= EntityRef | CharRef
[68] EntityRef ::= '&' Name ';' [ WFC: 声明实体 ]
[ VC: 声明实体 ]
[ WFC: 已析实体 ]
[ WFC: 无递归 ]
[69] PEReference ::= '%' Name ';' [ VC: 声明实体 ]
[ WFC: 无递归 ]
[ WFC: 在DTD内 ]
格式约束: 声明实体
在一个没有任何DTD的文档,或一个只有不包含参数实体引用的内部DTD子集的文档,
或一个"standalone='yes'"的文档内,在实体引用中给出的Name必须与实体声明中
所给出的相匹配,但格式良好的文档不需要声明以下的这些实体:amp,lt,gt,a
pos和quot。参数实体的声明必须先于任何对它的引用。类似地,通用实体的声明必
须先于任何在属性表声明中的缺省值中出现的对它的引用。注意对于在外部子集或
外部参数实体中声明的实体,不进行验证的处理器不必要读取和处理它们的声明;对
这些文档,仅当standalone='yes'时,实体必须被声明的规则才是一个格式约束。
有效性约束: 声明实体
在一个有外部子集或外部参数实体且"standalone='no'"的实体中,实体引用中给出
的Name必须与实体声明中所给出的相匹配。出于互操作性考虑,有效的文档应该以
"4.6 预定义实体"中的简化形式声明实体amp,lt,gt,apos和quot。参数实体的声
明必须先于任何对它的引用。类似地,通用实体的声明必须先于任何在属性表声明
中的缺省值中出现的对它的引用。
格式约束: 已析实体
实体引用不能包含一个未析实体的名字。未析实体只能在声明为ENTITY或ENTITIES
的属性值中引用。
格式约束: 无递归
已析实体不能直接或间接地包含对自身的递归引用。
格式约束: 在DTD内
参数实体引用只能在DTD中出现。
字符引用和实体引用的例子:
Type <key>less-than</key> (<) to save options.
This document was prepared on &docdate; and
is classified &security-level;.
参数实体引用的例子:
<!-- declare the parameter entity "ISOLat2"... -->
<!ENTITY % ISOLat2 SYSTEM "http://www.xml.com/iso/isolat2-xml.entities"
>
<!-- ... now reference it. -->
%ISOLat2;
4.2 实体声明(Entity Declaration)
实体以如下方式声明:
实体声明
[70] EntityDecl ::= GEDecl | PEDecl
[71] GEDecl ::= '<!ENTITY' S Name S EntityDef S? '>'
[72] PEDecl ::= '<!ENTITY' S '%' S Name S PEDef S? '>'
[73] EntityDef ::= EntityValue | (ExternalID NDataDecl?)
[74] PEDef ::= EntityValue | ExternalID
实体引用中的Name标识了该实体;对于未析实体,ENTITY或ENTITIES属性的值标识了
该实体。如果同一实体被声明了不止一次,绑定第一个声明。由用户选择,如果实
体被多次声明,XML处理器可以给出警告。
4.2.1 内部实体(Internal Entities)
如果实体定义是一个EntityValue,被定义的实体被称为内部实体。内部实体没有单
独的物理存储对象,实体的内容在声明中给出。注意字面实体值中一些实体和字符
引用的处理可能要求产生正确的置换文本:参见"4.5 内部置换文本的构造"。
内部实体是已析实体。
内部实体声明的例子:
<!ENTITY Pub-Status "This is a pre-release of the
specification.">
4.2.2 外部实体(External Entities)
如果实体不是内部的,那么它是一个外部实体,声明如下:
外部实体声明
[75] ExternalID ::= 'SYSTEM' S SystemLiteral
| 'PUBLIC' S PubidLiteral S SystemLiteral
[76] NDataDecl ::= S 'NDATA' S Name [ VC: 声明符号 ]
如果有NDataDecl,那么这是一个通用未析实体;否则它是一个已析实体。
有效性约束: 声明符号
Name必须与符号的名字相匹配。
SystemLiteral被称为该实体的系统标识符。这是一个URI,可以用于查找此实体。
注意井号(#)和URI中常用的片断标识符形式上而言不是URI的一部分;如果一个片断
标识符作为系统标识符的部分给出,XML处理器可以给出一个错误。除非在本规范范
围之外另外给出(如,一个特殊DTD定义的专用XML元素类型,或一个特殊应用规范中
定义的处理指令),相对URI指相对于实体声明所在资源的位置。因此,一个URI可能
是相对于文档实体,或相对于包含外部DTD子集的实体,或相对于其他一些外部参数
实体。
XML处理器处理URI中的非ASCII字符时,将UTF-8中的字符用一个或多个字节表示,
然后将这些字符用URI转义机制转义(即,将每个字节转换成%HH,其中HH是字节值的
十六进制符号)。
除了系统标识符之外,外部标识符还可以包含公共标识符。试图查找实体内容的XM
L处理器可以用公共标识符试着产生一个可选URI。如果处理器无法做到这一点,它
必须使用系统常量中定义的URI。在试着匹配之前,公共标识符中所有空白字符串必
须被规范为单个空格字符(#x20),同时必须去掉前导和尾随空白。
外部实体声明的例子:
<!ENTITY open-hatch
SYSTEM "http://www.textuality.com/boilerplate/OpenHatch.xml">
<!ENTITY open-hatch
PUBLIC "-//Textuality//TEXT Standard open-hatch boilerplate//EN
"
"http://www.textuality.com/boilerplate/OpenHatch.xml">
<!ENTITY hatch-pic
SYSTEM "../grafix/OpenHatch.gif"
NDATA gif >
4.3 已析实体(Parsed Entities)
4.3.1 文本声明(Text Declaration)
每个外部已析实体可以以文本声明作为开始。
文本声明
[77] TextDecl ::= '<?xml' VersionInfo? EncodingDecl S? '?>'
文本声明必须以字面形式给出,而不能使用已析实体的引用。文本声明只能在外部
已析实体的开头出现,不允许在其他任何地方出现。
4.3.2 格式良好的已析实体(Well-Formed Parsed Entities)
如果文档实体匹配document产生式,那么它是格式良好的。如果外部通用已析实体
匹配extParsedEnt产生式,那么它是格式良好的。如果外部参数实体匹配extPE产生
式,那么它是格式良好的。
格式良好的外部已析实体
[78] extParsedEnt ::= TextDecl? content
[79] extPE ::= TextDecl? extSubsetDecl
如果内部普通已析实体的置换文本匹配content产生式,那么它是格式良好的。根据
定义,所有内部的参数实体都是格式良好的。
实体符合格式要求的一个结果是XML文档的逻辑和物理结构是严格嵌套的;起始标记,
结束标记,空元素标记,元素,注释,处理指令,字符引用,或实体引用都不能在
一个实体中开始而在另一个实体中结束。
4.3.3 实体中的字符编码(Character Encoding in Entities)
XML文档中的每个外部已析实体都可以对其字符采用一种不同的编码方案。所有XML
处理器必须能读编码为UTF-8或UTF-16的实体。
以UTF-16编码的实体必须以ISO/IEC 10646增补E和Unicode附录B(零宽度不间断空格
字符,#xFEFF)中所描述的字节次序标记(Byte Order Mark)开头。这是一个编码签
名,即不是XML文档中标记的一部分,也不是XML文档字符数据的一部分。XML处理器
必须能用此字符区分UTF-8编码和UTF-16编码的文档。
虽然XML处理器只被要求能读取UTF-8和UTF-16编码的实体,普遍认为国际上还有其
他编码方案。有时可能想让XML处理器读取以那些编码方案编码的实体。以不同与U
TF-8和UTF-16的编码方案存储的实体必须以包含编码声明的文本声明开头:
编码声明
[80] EncodingDecl ::= S 'encoding' Eq ('"' EncName '"' | "'" EncName
"'" )
[81] EncName ::= [A-Za-z] ([A-Za-z0-9._] | '-')* /* 编码方案的名字只包
含拉丁字母 */
在文档实体中,编码声明是XML声明的一部分。EncName是所用编码方案的名字。
在一个编码声明中,值"UTF-8","UTF-16","ISO-10646-UCS-2"和"ISO-10646-UCS
-4"应该用于表示Unicode或ISO/IEC 10646中的各种不同编码和变换方案,值"ISO-
8859-1","ISO-8859-2",... "ISO-8859-9"应该用于表示ISO 8859的各个部分,而
值"ISO-2022-JP","Shift_JIS"和"EUC-JP"应该用于表示JIS X-0208-1997的各种编
码。XML处理器可以识别其他编码方案;建议对于在Internet Assigned Numbers Au
thority [IANA]注册的字符编码方案(以字符集(charset)的方式),除了以上所列的
之外,引用时应使用其注册名。注意这些注册名定义为大小写敏感,因此欲与之匹
配的处理器要以大小写敏感的方式进行匹配。
在缺少外部传输协议(如HTTP或MIME)所提供的信息时,以下情况均是错误:XML处理
器接收到的实体的编码方案与实体所含编码声明中指出的编码方案不同,编码声明
不在外部实体的开头,既不以字节次序标记开头也不以编码声明开头的实体使用了
不同于UTF-8的编码。注意因为ASCII是UTF-8的一个子集,以普通ASCII编码的实体
不严格需要编码声明。
当XML处理遇到的实体使用了它不能处理的编码时,是一个严重错误。
编码声明的例子:
<?xml encoding='UTF-8'?>
<?xml encoding='EUC-JP'?>
--
山居且喜远纷华,俯仰乾坤野性赊。
千载勋名身外影,百岁荣辱镜中花。
金 琢 倒秋将暮,蕙径萧瑟日且斜。
闻道五湖烟境好,何 蝮业鐾∩场?
--
与其相濡以沫,不若相望于江湖。
http://10.23.31.91/
http://10.23.31.91:9999
※ 来源:.听涛站 cces.net.[FROM: 匿名天使的家]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:1.371毫秒