简体中文码:GB2312
繁体中文码:BIG5
西欧字符:UTF-8
1、一般实体
我们前面说到的那个信件署名就是一般实体。定义一般实体的格式如下:
<!ENTITY实体名"文本内容"〉
关于刚才的信件署名的实体定义如下:
<!ENTITYlettersign
"张三
某网络公司销售部门
北京市海淀区中关村88号,100000"〉
另外,你也可以指定一个实体代替一个外部文件的内容,此时要使用SYSTEM这个关键字。例如:
<!ENTITYlettersign
SYSTEM"http://www.mydomain.com/lettersign.xml"〉
在这个例子中,XML处理器将用指定文件的内容来替换实体指示。
2、参数实体
与一般实体相同,参数实体既可以是内部的也可以是外部的。不过,参数实体只用在DTD中。
参数实体的格式与一般实体很类似,只不过中间要加上“%”符。
<!ENTITY%实体名"文本内容"〉
3、实体的使用包括两部分:实体声明和实体引用。
4、实体声明
对于实体的声明应该放在文件类型DOCTYPE中。DOCTYPE一般放在文件头(即XML声明和DTD)之后,
XML元素之前。这样一来,XML文件就变为下面的形式:
<?xmlversion="1.0"?>
<!DOCTYPE文件根元素名[
实体声明部分
]>
<文件根元素名>
具体数据内容
</文件根元素名>
5、实体引用
说到实体引用,大家可能想起前面我们曾用“<”代表字符“〈”。不错,这就是一个实体引用。
简而言之,实体引用指的是引用一个在实体声明中已经声明过的一个实体。实体引用的形式很简单:
&实体名;
6、实体引用有以下几点规则一定要注意:
在引用XML实体之前,必须已经在XML文件中对此实体进行过声明;
在实体引用中不能出现空格。也就是说,&lettersign;和&letterhead;的用法都会引起错误。
尽管在一个实体中可以再引用其它实体,但是不能出现循环引用。也就是说,一个实体不能引用它自己;
同样,也不能出现实体A引用实体B,然后实体B再反过来引用实体A的情况。
实体引用不能在DOCTYPE声明中出现。
实体引用的文本必须是形式良好的XML。
同样,参数实体的引用与一般实体的引用大同小异,只是要把实体前的符号&换为%就可以了,形式是:
%实体名;
7、实体引用不仅可以出现在字符数据中,还可以出现在标记的属性中。例如下面这个例子:
<联系人公司=“B公司”地址=“&B公司地址;”>
如果在属性中出现实体引用,不但要遵守前面所述的实体引用的种种规则,还要注意以下两点:
在标记属性中不能引用一个外部实体。
引用的文本中不能出现字符“<”,否则替换后就不再是一个“形式良好的”XML文件了。
通过这一节的讲述,想必大家已然了解:实体主要是用来代替字符数据的,它可以节省大量的录入工作。
8、使用外部DTD时,要在DOCTYPE中使用关键字SYSTEM。实际上,SYSTEM不是引用外部DTD的唯一方法,
这个关键字主要用于引用一个作者或组织所编写的众多XML文件中通用的DTD。还存在一种外部DTD,
它是一个由权威机构制订的,提供给特定行业或公众使用的DTD。因此,另一个引用外部DTD的办法是使用关键字PUBLIC,
引用这一类公开给公众使用的DTD。
当使用关键字PUBLIC进行引用时,这个外部DTD还需要得到一个标识名。引用公共DTD的形式为:
<!DOCTYPE根元素PUBLIC"DTD名称""外部DTD的URL">
9、这个DTD标识的命名规则和XML文件的命名规则稍有不同。具体地说,DTD名称只能包含字母、
数字、空格和下面的符号:_%$#@()+:=/!*;?。同时,DTD名称还必须符合一些标准的规定。
例如,ISO标准的DTD以“ISO”三个字母开头;被改进的非ISO标准的DTD以加号“+”开头;未被改进的非ISO标准的DTD以减号“-”开头。
无论是哪一种情况,开始部分后面都跟着两个斜杠“//”及DTD所有者的名称。在这个名称之后又是两个斜杠“//”,
再然后是DTD所描述的文件的类型。最后,在又一对斜杠之后是语言的种类(参见ISO639)。例如下面这个公用DTD的引用:
<!DOCTYPE联系人列表PUBLIC"-//LunaDong//ContactData//CN"
"http://www.mydomain.com/dtds/fclml.dtd">
10、除了根元素外,在定义其它元素时使用关键字ANY都是不好的习惯。一般来说,在写一个XML文件时需要严格遵循DTD的规则,
这时,一个定义明确的DTD,虽然表面上似乎充满了条条框框,但实际上会使你在书写XML文件时有规可循,
反而方便了你的工作和语法分析器的工作。相反,一个在元素定义中充满了ANY的DTD,反而可能会搞得你不知所措,一头雾水。
11、在定义元素时,ETD的顺序是无关紧要的。因此
<!ELEMENT姓名(#PCDATA)>
<!ELEMENT联系人列表ANY>
<!ELEMENT联系人(姓名)>
和
<!ELEMENT联系人列表ANY>
<!ELEMENT联系人(姓名)>
<!ELEMENT姓名(#PCDATA)>
所定义的文件结构是完全相同的。
12、还有一点要注意,不能对不同的元素使用相同的元素名,即便这些元素的内容、包含的子元素不同也不行,
因为它只会引起文件各个元素的混淆,使文件的可读性大打折扣。例如:
<!ELEMENT联系人列表ANY>
<!ELEMENT联系人(姓名)>
<!ELEMENT联系人(EMAIL)>
<!ELEMENT姓名(#PCDATA)>
<!ELEMENTEMAIL(#PCDATA)>
在这个例子中,对“联系人”的重复定义,会引起错误。13、最后再次强调一下元素的命名。元素名的第一个字母必须是字母、或下划线(_)、或冒号(:),
后跟字母、数字、句号(.)、冒号、下划线、连结号(-)的组合,并且不能包含空白符,不能以“xml”开头。
另外,尽管元素的第一个字母使用冒号是合法的,但最好避免这样做,因为它会引起混淆。再有需要注意的是,
尽管XML1.0标准允许使用任何长度的文件名,但是实际的XML处理器常常会限制标记名的长度。