定义元素及其子元素
我们定义了一个名为"联系人"的元素,并且解释过,它可以包含一个单独的子元素"姓名",而这个"姓名"元素中则包含了字符数据。具体的例子为:
?xmlversion="1.0"encoding="GB2312"standalone="yes"?!DOCTYPE联系人列表[!ELEMENT联系人列表ANY!ELEMENT联系人(姓名)!ELEMENT姓名(PCDATA)!ELEMENTEMAIL(PCDATA)!ELEMENTEMAIL(PCDATA)!ELEMENTEMAIL(PCDATA)!ELEMENTEMAIL(PCDATA)!ELEMENTEMAIL(PCDATA)!ELEMENT电话(PCDATA)
注意:XML正则表达式的匹配原则不允许循环逻辑。
所以,OR的意思是或者选这个或者选那个,但不能两个都选,也不能两个都不选(简单一点,两个中任选一个)。
一个符合上述DTD定义的"有效的"XML文件的定义应该是:
联系人姓名张三/姓名电话12345678/EMAIL/联系人
或者是:
联系人姓名张三/姓名EMAILzhang@/EMAIL/联系人
注意:在一个组中,只允许使用一种连接符(例如","或"|")。因此,像下面这样定义的DTD是不合法的:
!ELEMENT联系人(姓名,电话|EMAIL)
要想使用多种连接符,只有通过创建子组的方式,使用
!ELEMENT联系人(姓名,(电话|EMAIL))
可选子元素
字符"?"说明一个子元素是可选的,它可以出现,也可以不出现。因此,在下面的DTD中,我们规定,每一个"联系人"都必须有一个"姓名"子元素,
同时或者有一个"电话"子元素,或者有一个"EMAIL"子元素,此外,它还可以包含一个"地址"子元素,也可以不包含这种元素。
!ELEMENT联系人(姓名,(电话|EMAIL),地址?)!ELEMENT姓名(PCDATA)!ELEMENTEMAIL(PCDATA)!ELEMENT城市(PCDATA)
根据这个DTD描述,下面的XML片段是"有效的":
联系人姓名张三/姓名EMAILzhang@/EMAIL地址街道五街1234号/街道城市北京市/城市省份北京/省份/地址/联系人
同样,下面这段不包含"地址"元素的XML片段也是"有效的":
联系人姓名张三/姓名EMAILzhang@/EMAIL/联系人
混合内容
当然,可能也有一些时候,你在一个元素中既希望包含子元素,也希望包含纯文本。XML中允许这种使用方法,并把这种元素称为混合内容的元素。
在下面的例子中,"联系人"就是一个混合元素。
?xmlversion="1.0"encoding="GB2312"standalone="yes"?!DOCTYPECONTACTS[!ELEMENT联系人列表ANY!ELEMENT联系人(姓名|电话|EMAIL|PCDATA)!ELEMENT电话(PCDATA)]联系人列表联系人姓名张三/姓名电话(010)62345678/电话EMAILzhang@/EMAIL这是关于张三的信息/联系人/联系人列表
注意:由于在"(姓名|电话|EMAIL|#PCDATA)"之外有"*",所以在元素"联系人"中可以包含零个或多个"姓名"、电话、EMAIL和纯文本字段。





