我们可以利用DTD文件来规格化XML文件,并可以利用它来校验XML文件是否是规格化好的。它的原理如下:
【基本原理】
在DTD文件中详细规定好XML文件中所有可能出现的元素,并且元素的层次关系、元素的属性、元素的值的类型都是有详细的定义的。这就好比DTD是一个模版,而XML文件就是在这个模版下具体填入了相应的值。
【DTD声明子节点方式】
1、<!ELEMENT A ANY>
含义:A节点下可以包含任意节点类型,最简单的情况。
2、<!ELEMENT A (#PCDATA)>
含义:A节点只能包含文本信息。
3、<!ELEMENT A (B,C)>
含义:A节点可以而且必须包含B和C节点,并且B节点必须位于C节点之前。
4、<!ELEMENT A (B*,C)>
含义:A节点后面可以包含任意数目的B节点,然后紧跟着一个C节点。
5、<!ELEMENT A (B?,C+)*>
含义:这种情况比较复杂,先忽略最外层的*,B?表示可以有一个且最多一个B节点,然后至少一个C节点。 然后综合考虑最外层的*,这种组合可以重复出现的次数为0,1,2,....试着枚举一下,可能的情况: BC,BCC,...,C,CC,CCC,...,BBC,BBCC,BBCCC...,BCBC,BCBCBC,...,...
元字符定义:
元 字 符 | 含 义 |
---|---|
+ | 出现一次或多次 |
* | 出现零次或多次 |
? | 可选,不出现或出现一次 |
() | 一组要共同匹配的表达式 |
| | OR,或 |
, | AND,要求严格遵从顺序要求 |
元素A 元素B 元素C |
元素列表,无须遵从顺序要求 |
【DTD文件】
<!DOCTYPE 联系人列表[
<!ELEMENT 联系人列表 (联系人)*>
<!ELEMENT 联系人 (姓名,ID,公司,EMAIL,电话,地址)>
<!ELEMENT 地址 (街道,城市,省份)>
<!ELEMENT 姓名 (#PCDATA)>
<!ELEMENT ID (#PCDATA)>
<!ELEMENT 公司 (#PCDATA)>
<!ELEMENT EMAIL (#PCDATA)>
<!ELEMENT 电话 (#PCDATA)>
<!ELEMENT 街道 (#PCDATA)>
<!ELEMENT 城市 (#PCDATA)>
<!ELEMENT 省份 (#PCDATA)>
]>
【定义后XML】
<联系人列表>
<联系人>
<姓名>张三</姓名>
<ID>001</ID>
<公司>A公司</公司>
<EMAIL>[email protected]</EMAIL>
<电话>(010)62345678</电话>
<地址>
<街道>五街1234号</街道>
<城市>北京市</城市>
<省份>北京</省份>
</地址>
</联系人>
<联系人>
<姓名>李四</姓名>
<ID>002</ID>
<公司>B公司</公司>
<EMAIL>[email protected]</EMAIL>
<电话>(021)87654321</电话>
<地址>
<街道>南京路9876号</街道>
<城市>上海</城市>
<省份>上海</省份>
</地址>
</联系人>
</联系人列表>
【元素属性的定义】
元素的属性
在DTD中定义属性时,我们使用下面的格式:
视实际情况而选择,给出一个实际的例子:
<!ATTLIST 页面作者
姓名 #CDATA #IMPLIED
年龄 #CDATA #IMPLIED
联系信息 #CDATA #REQUIRED
网站职务 #CDATA #FIXED "页面作者"
个人爱好 #CDATA "上网"
>
另外还有属性的类型:
参数实体专门用在DTD中。定义方式是:
引用方式为: %实体名;
使用参数实体,可以方便元素和属性的声明。例如: