源码先锋

源码先锋

XML 定义元素和后代

admin 129 153

定义元素及其子元素

我们定义了一个名为"联系人"的元素,并且解释过,它可以包含一个单独的子元素"姓名",而这个"姓名"元素中则包含了字符数据。具体的例子为:

?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和纯文本字段。