扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:中国IT实验室 来源:中国IT实验室 2007年9月22日
关键字:
在本页阅读全文(共6页)
元素类型声明2
为了使元素“联系人列表”中还可以包含其它元素,从而使前面的那个文件是“有效 的”,我们还需要定义元素“联系人”和“姓名”。
<?xml version = "1.0" encoding="Gb2312" standalone = "yes"?>
<!DOCTYPE 联系人列表[
<!ELEMENT 联系人列表 ANY>
<!ELEMENT 联系人(姓名)>
<!ELEMENT 姓名(#PCDATA)>
]>
<联系人列表>
<联系人>
<姓名>张三</姓名>
</联系人>
</联系人列表>
现在我们已经定义了一个XML文件,它的根元素名为“联系人列表”。“联系人列表” 中可以包含任何纯文本数据,也可以含有子元素(这即是ANY的含义)。根据后面的定义,我们知道,“联系人列表”中可以包含子元素“联系人”,也可以直接包含子元素“姓名”;“联系人”元素又可以包含自己的子元素,名为“姓名”;而“姓名”则只能包含纯文本数据(即(#PCDATA))。
注意:
除了根元素外,在定义其它元素时使用关键字ANY都是不好的习惯。
在定义元素时,Etd的顺序是无关紧要的。
还有一点要注意,不能对不同的元素使用相同的元素名,即便这些元素的内容、包含的子元素不同也不行,因为它只会引起文件各个元素的混淆,使文件的可读性大打折扣。
元素名的第一个字母必须是字母、或下划线(_)、或冒号(:),后跟字母、数字、句号(.)、冒号、下划线、连结号(-)的组合,并且不能包含空白符,不能以 “xml”开头。尽管XML1.0标准允许使用任何长度的文件名,但是实际的XML处理器常常会限制标记名的长度。
定义元素及其子元素
对于以下的例子:
<?xml version = "1.0" encoding="Gb2312" standalone = "yes"?>
<!DOCTYPE 联系人列表[
<!ELEMENT 联系人列表 ANY>
<!ELEMENT 联系人(姓名)>
<!ELEMENT 姓名(#PCDATA)>
]>
<联系人列表>
<联系人>
<姓名>张三</姓名>
</联系人>
</联系人列表>
准确的说法是,元素“联系人”必须包含一个,且只能包含一个子元素“姓名”。可如果子元素是“EMAIL地址”怎么办?联系人可能根本没有自己的EMAIL邮箱,也可能有好几个EMAIL帐号。
使用正则表达式,我们就可以解决上述问题,描述父元素与子元素之间非常复杂的关系。例如,你可以对一个元素作如下任何一种类型的定义:它有一个子元素,有一个或多个子元素,有零个或多个子元素,至少有一个子元素。你还可以定义复合关系,比如“元素X是有效的,如果它含有一个或多个子元素Y,或一个子元素Z”。
元素定义是由它们的元素内容模型(ECM)来描述的,也就是说,是由紧跟元素后面的括号中的内容来定义的。因此,正如我们前面见到的,元素“联系人”的ECM被描述为子元素“姓名”: <!ELEMENT 联系人(姓名)>
ECM中的内容采取一组正则表达式的形式。在下表中,我们列出了正则表达式中可能出现的元字符:
元字符 含义
+ 出现一次或多次
* 出现零次或多次
? 可选,不出现或出现一次
() 一组要共同匹配的表达式
| OR,或,AND 要求严格遵从顺序要求
下面几节中,我们将通过一些例子具体讲解这些元字符的用法,对使用正则表达式来定义ECM的方法获得一些感性认识。
有顺序的子元素
一个元素的各个子元素之间可以以任意顺序出现,也可以强制遵循一定的顺序。
考虑下面的Dtd定义:
<!ELEMENT 联系人(姓名 EMAIL)>
<!ELEMENT 姓名(#PCDATA)>
<!ELEMENT EMAIL(#PCDATA)>
遵从这个Dtd的XML文件可以为:
<联系人>
<姓名>张三</姓名>
<EMAIL>zhang@aaa.com</EMAIL>
</联系人>
同样,下面这个XML文件也是有效的:
<联系人>
<EMAIL>zhang@aaa.com</EMAIL>
<姓名>张三</姓名>
</联系人>
由于我们在Dtd定义中仅仅用空白符分隔了元素“联系人”的两个子元素,这说明我们并没有严格要求两个元素出现的顺序,因此上面两种写法都是允许的。如果我们使用逗号“,”来分隔两个子元素,那么XML文件中,元素“姓名”就必须出现在元素“EMAIL”前面。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者