XML实体能扮演好几个角色,例如用之来替代重复出现的字符(象速记字符一样),或代表外部数据(如XML文档或其它数据),或作为声明元素的一部分。Schema有它自己处理实体的机制。我曾经看到过一些使用Schema来定义XML文档结构并将它们和DTD中定义的实体相混用的例子。
XML实体应用很普遍,大多数的发行的DTD和schema都使用实体来组织重复的值,这些值表示特殊的符号(例如,格式化的字符和版权信息),或者为元素定义参数。你甚至可能还没有意识到你已经用过XML实体了,因为有些实体被集成到HTML中了(例如, 代表不间断空格)。
虽然XML规范只包含五个实体,但是开发者可以创建自己实体并可以在整个XML文档中使用它们。在XML使用实体跟在HTML和SGML使用一样。用一个与符号(&)加上实体的名称,然后加上一个分号(;)就可以了。
下面的例子使用了一个内部的DTD,在这个例子中,一个在线式的邮件系统需要存储并发送这个XML文档,它能被处理到一个大系统中。每个store有一个名字(name)、电话号码(phone number)、一些促销信息(promotional text)和一个标志图(logo)。
<?xml version="1.0"?> <!DOCTYPE store [ <!ELEMENT mall (store)> <!ELEMENT store (name,phone,promo,image)> <!ELEMENT name (#PCDATA)> <!ELEMENT phone (#PCDATA)> <!ELEMENT promo (#PCDATA)> <!ELEMENT image (#PCDATA)> <!ELEMENT text (#PCDATA)> <!ENTITY storeName "Sample Store"> <!ENTITY storePromo SYSTEM "./StorePromo.txt"> <!ATTLIST image width CDATA #IMPLIED> ]>
用实体来定义storeName,如果storeName的值被改变,XML编辑器和应用程序没有必要每次都通过分析整个文档来改变storeName,只要改变实体storeName的值就可以了,因为它替代了文档中所有的storeName。当你创建这个XML文档之后,它能被上载到服务器来进行处理,store的拥有者也能发布一个简单的包含促销信息的文本文件,如果要改变促销信息,你只要发送象下面这样一个新文本文件到系统中就可以了。
<store> <name>&storeName;</name> <phone>222-333-4444</phone> <promo>&storePromo;</promo> <image width="200">logo.gif</image> </store>