由于XML文件中Element的定义可能会不规则,我们直接用Java对XML文件进行解析的时候,会需要大量的编程和错误检查工作,还要检查该文档包含的节点是否和我们期待的一样。
我们可能会需要指定XML文档的结构,比如:文档类型定义(DTD)和XML Schema。DTD和Schema包含了用于解释文档如何构成的规则,这些规则指定了每个元素的合法子元素和属性。
提供DTD的方法有多种:
第一种,就是直接将DTD的规则纳入到XML文件当中
<?xml version ="1.0"?>
<!DOCTYPE configuration<pre name="code" class="html"><span style="white-space:pre"> </span><?configuation是下面的configuration,你是可以换成其他的,只要保证和XML文件中的开头就可以了?>
[ <!Element configuration ...> more rules ...]><configuration>...</configuration>
正如你看到的将这些规则纳入到XML文件当中并用[]符号限定其界限。
第二种,编写外部DTD文件(和xml文件差不多的写法,文档类型存为.dtd就可以了),在XML文件中通过SYSTEM声明来实现这个目标。
test1.dtd
<!ELEMENT configuration (title|body|window|color|menu)+>
<!ELEMENT title (fontname,fontsize)>
<!ELEMENT body (fontname,fontsize)>
<!ELEMENT window (heigh,width)>
<!ELEMENT color (red,green,blue)>
<!ELEMENT menu (item)+>
<!ELEMENT fontname (#PCDATA)>
<!ELEMENT fontsize (#PCDATA)>
<!ELEMENT heigh (#PCDATA)>
<!ELEMENT width (#PCDATA)>
<!ELEMENT red (#PCDATA)>
<!ELEMENT blue (#PCDATA)>
<!ELEMENT green (#PCDATA)>
<!ELEMENT item (#PCDATA)>
<!ATTLIST item fontsize CDATA #REQUIRED>
test1.xml
<pre name="code" class="html"><?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration SYSTEM "test1.dtd>
<configuration>
...
</configuration>
上面讲了如何定位DTD文件,下面来介绍一些DTD文件中的不同类型的规则
1.ELEMENT规则:用于指定某个元素可以拥有怎么样的子元素。
元素内容的规则
规则 |
含义 |
E* | 0或者多个E |
E+ | 1或者多个E |
E? | 0或者1个E |
E1|E2|...|En | E1,E2,...,En中的一个 |
E1,E2,...,En | E1 随后是E2,...,En |
#PCDATA | 文本 |
(#PCDATA|E1|...|En)* | 0或者多个文本和E1,E2,...,En,以任意顺序排列(混合式内容) |
ANY | 允许任意子元素 |
EMPTY | 不允许有子元素 |
通用语法一般为以下:
<pre name="code" class="html"><!ELEMENT element type>
比如
<!ELEMENT configuration (title|body|window|color|menu)*>
<!ELEMENT menu(item)*>
<!ELEMENT fontname(#PCDATA)>
2.元素属性的规则
类型 | 含义 |
CDATA | 任意字符串 |
(A1|A2|...|An) | 字符串属性A1|A2|...|An之一 |
NMTOKEN NMTOKENS | 1或者多个名字标记 |
ID | 1个唯一的ID |
IDREF IDREFS | 1个或者多个对唯一ID的引用 |
ENTITY ENTITIES | 1或者多个未解析的实体 |
默认值 | 含义 |
#REQUIRED | 属性是必须的 |
#IMPLIED | 属性是可以选择的 |
A | 属性是可选,未指定时为A |
#FIXED A | 属性必须是未指定或者A:两种情况下属性都是A |
通用语法为:
</pre><pre name="code" class="plain"><!ATTLIST element attribute type default>
比如
<pre name="code" class="html"><!ATTLIST item fontName #CDATA #REQUIRED>
实例:
test1.dtd
<!ELEMENT configuration (title|body|window|color|menu)+>
<!ELEMENT title (fontname,fontsize)>
<!ELEMENT body (fontname,fontsize)>
<!ELEMENT window (heigh,width)>
<!ELEMENT color (red,green,blue)>
<!ELEMENT menu (item)+>
<!ELEMENT fontname (#PCDATA)>
<!ELEMENT fontsize (#PCDATA)>
<!ELEMENT heigh (#PCDATA)>
<!ELEMENT width (#PCDATA)>
<!ELEMENT red (#PCDATA)>
<!ELEMENT blue (#PCDATA)>
<!ELEMENT green (#PCDATA)>
<!ELEMENT item (#PCDATA)>
<!ATTLIST item fontsize CDATA #REQUIRED>
test1.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration SYSTEM "test1.dtd">
<configuration>
<title>
<fontname>Helvetica</fontname>
<fontsize>36</fontsize>
</title>
<body>
<fontname>Helvetica</fontname>
<fontsize>36</fontsize>
</body>
<window>
<heigh>200</heigh>
<width>400</width>
</window>
<color>
<red>0</red>
<green>50</green>
<blue>100</blue>
</color>
<menu>
<item fontsize="12">Times Roman </item>
<item fontsize="12">Helvetica</item>
</menu>
<window>
<heigh>2200</heigh>
<width>4200</width>
</window>
<color>
<red>20</red>
<green>150</green>
<blue>100</blue>
</color>
<menu>
<item fontsize="12">Times Roma1n </item>
<item fontsize="12">Helvetic1a</item>
</menu>
</configuration>