xml入门(二)----DTD

来源:互联网 发布:创世纪 知乎 编辑:程序博客网 时间:2024/06/05 02:52

DTD的作用

XML文档是一种元标记语言,即一种定义标记语言的语言。在XML中可以创建新的标记语言,这些新的标记语言(也叫标记集)要通过文档类型定义(Document Type Definitions,DTD)来定义。DTD文档是这些新的标记语言的法律性文档。如果XML文档的语法符,DTD的定义和规定,那么就称为一个合法的XML文档,否则就是非法的XML文档。合法的XML文档在实际应用中的地位很重要,因为只有合法的XML文档才能被应用软件有效地处理。

DTD定义了文档的逻辑结构,规定了文档中所使用的元素、实体、元素的属性、元素与实体之间的关系。其作用主要表现在以下几个方面。

 (1) 使用DTD可以提供一种统一的格式。XML的可扩展性为文档的作者提供了很高的灵活性,可有时候需要的是统一,要求某一类文档具有相同的结构。 (2) 使用DTD可以保证数据交流和共享的顺利进行。 (3) DTD使用户能够不依赖具体的数据就知道文档的逻辑结构。在没有XML文档的时候,也可以根据DTD为XML文档编写样式单,编写处理程序,这样可以有效地提高工作效率。 (4) 使用DTD可以验证数据的有效性。DTD对文档的逻辑结构进行了约束,这种约束可以比较宽松,也可以十分严格。可以根据DTD检查数据,以验证其是否符合规定和要求,这可以保证数据的正确和有效。

DTD元素

元素的基本类型

1. 简单型

“#PCDATA”(Parsed Character Data)表示标记的内容是可解析文本,所谓的可解析文本就是非标记文 本。用“#PCDATA”规范了的元素不能再包含子元素。例如How do you do是不包含标记的文本,而 How do you do就不是可解析的数据类型,因为其中包含有标记和。另外DTD文档中不同元素定义的次序没有先后关系,但文档的语法对大小写敏感。
“#PCDATA”的声明格式:<!ELEMENT Element_Name (#PCDATA )>
“#PCDATA”的用法,代码如源程序code4_1.xml所示。

<?xml version="1.0" encoding="gb2312" ?><!DOCTYPE bookinfo [<!ELEMENT bookinfo (title,author,publisher,price)><!ELEMENT title (#PCDATA)><!ELEMENT author (#PCDATA)><!ELEMENT publisher (#PCDATA)><!ELEMENT price (#PCDATA)>]><bookinfo>        <title>计算机导论</title>        <author>丁跃潮等</author>        <publisher>高等教育出版社</publisher>        <price>19.7</price></bookinfo>
2. 复合型

复合型元素与简单型元素相对,复合型元素可包含其他元素。

<?xml version="1.0" encoding="gb2312" ?><!DOCTYPE bookinfo [<!ELEMENT bookinfo (title,author,publish,price)><!ELEMENT title (#PCDATA)><!ELEMENT author (#PCDATA)><!ELEMENT publish (publisher,ISBN,pubdate)><!ELEMENT publisher (#PCDATA)><!ELEMENT ISBN (#PCDATA)><!ELEMENT pubdate (#PCDATA)><!ELEMENT price (#PCDATA)>]><bookinfo>        <title>计算机导论</title>        <author>丁跃潮等</author>        <publish>            <publisher>高等教育出版社</publisher>            <ISBN>7-04-014768-8</ISBN>            <pubdate>2004.6</pubdate>        </publish>        <price>19.7</price></bookinfo>

元素的声明

1. 元素声明的基本语法

元素的声明格式:<ELEMENT Element_Name Element_Defination>
其中,Element_Name为声明的元素名称,Element_Defination为元素内容格式的定义。
合法的元素声明语句如:

<!ELEMENT bookinfo (title,author,publish,price)><!ELEMENT publisher (#PCDATA)>
2.空元素的声明
<ELEMENT Element_Name EMPTY>
3.不限定元素内容的声明
<!ELEMENT Element_Name ANY>
4.元素出现次数的控制

(1) 一个元素可能出现一次,也可能不出现。这时可通过在元素名后面加上一个“?”来实现。
(2) 一个元素可能不出现,也可能出现多次。这时可通过在元素名后面加上一个“*”来实现。
(3) 一个元素可能出现一次,也可能出现多次,但至少也要出现一次。这时可通过在元素名后面加上一个“+”来实现。

DTD属性

属性的声明格式:

<!ATTLIST Element_name Attribute_name TYPE Default_value>

<!ATTLIST>为属性声明的关键字,Element_name为元素名,Attribute_name为属性名,TYPE是属性类型,Default_value为没有设定属性值时的默认值。

<?xml version="1.0" encoding="gb2312" ?><!DOCTYPE bookinfo [<!ELEMENT bookinfo (title,author,publisher,price)><!ATTLIST bookinfo ISBN CDATA "7-04-014768-8"><!ELEMENT title (#PCDATA)><!ELEMENT author (#PCDATA)><!ELEMENT publisher (#PCDATA)><!ELEMENT price (#PCDATA)>]><bookinfo ISBN="7-04-014768-8">        <title>计算机导论</title>        <author>丁跃潮等</author>        <publisher>高等教育出版社</publisher>        <price>19.7</price></bookinfo>

可以多次为一个元素声明其中所包含的属性。如在XML文档中有如下语句:

<bookinfo id="001" bookcategory="文艺" ></bookinfo>

属性声明可以为

<!ATTLIST bookinfo id CDATA "001"><!ATTLIST bookinfo bookcategory CDATA "文艺" ><!ELEMENT bookinfo (#PCDATA)>

属性的声明在文档中的次序没有严格的要求,可位于与其相连的元素声明之前或之后。如在XML文档中有如下语句:

<bookinfo id="001" bookcategory="文艺" ></bookinfo>

属性声明可以为

<!ATTLIST bookinfo bookcategory CDATA "文艺" ><!ATTLIST bookinfo id CDATA "001"><!ELEMENT bookinfo (#PCDATA)>

属性有4种不同类型的默认值,可在属性声明中的Default_value部分指定。
① default:表示使用提供的默认值,default不是一个关键字,它代表一个预设的字符串。

<!ATTLIST bookinfo bookcategory (文艺|自然科学) "文艺" >

此例句表示当在XML文档中省略了对bookinfo元素的bookcategory属性值进行设定时,该属性的默认值就是“文艺”。
② #REQUIRED:表示属性值必须指定。
③ #IMPLIED:表示元素的这个属性可用可不用。
④ #FIXED:表示元素的这个属性值是一个固定值,且必须是指定的值。

属性的类型

  1. CDATA型
    CDATA型表明属性值为不包含“<”和“””的任意字符串,如果属性值中需要包含“<”和“””,则可使用特殊字符来代替。
  2. Enumerated型
    如果属性值并不是任意的字符串,而是在几个可能的值中进行选择,如书籍的“类别”属性,其值可为“文艺”,也可为“自然科学”,而不可能为其他情况时,则可以将书籍的“类别”属性设定为Enumerated型。
  3. ID型
    当元素的某个属性值是不能重复时,如书籍的ISBN属性、个人的“身份证号”属性等,要定义这样的属性则需使用属性的ID类型。在一个XML文档中,所有元素的ID类型属性的属性值必须是唯一的,不可重复,另外,一个元素不能有超过一个ID类型的属性。
  4. IDREF与IDREFS型
    IDREF为Identifier Reference的缩写,IDREF与ID类型属性的关系为子元素与父元素的关系,即IDREF类型属性的值必须是其他元素的ID类型属性的值,且该ID类型属性的值必须在文档的其他地方被设定过。IDREFS类型属性的属性值可有多个,每一个都必须是在文档其他地方被设定了的ID类型属性的值,而这多个属性值之间用空格隔开。
  5. ENTITY与ENTITIES型
    ENTITY类型的属性提供了把外部二进制形式的文件(如.jpeg、.mp3等)和外部不可解析实体链接到XML文档的功能。因此其属性值也必须为不可解析的链接外部实际数据的通用实体名。ENTITIES类型属性的属性值可由多个不可解析的外部实体名称组成,各实体名称之间使用空格隔开。
    ENTITY与ENTITIES的使用,代码如源程序code4_11.xml所示。


<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE customers [
<!ELEMENT customers (customer*)>
<!ELEMENT customer (username, password, picture)>
<!ELEMENT username (#PCDATA)>
<!ELEMENT password (#PCDATA)>
<!ELEMENT picture EMPTY>
<!ATTLIST picture pic ENTITIES #REQUIRED
>
<!ATTLIST customer
ID #REQUIRED
>
<!ENTITY pic1 SYSTEM "a.jpg">
<!ENTITY pic2 SYSTEM "b.jpg">
<!ENTITY pic3 SYSTEM "c.jpg">
<!ENTITY pic4 SYSTEM "d.jpg">
]>
<customers>
<customer ID="c0500103">
<username>cheaperget</username>
<password>12345678</password>
<picture pic="pic1 pic2"/>
</customer>
<customer ID="c0500208">
<username>dreamingboy</username>
<password>22345678</password>
<picture pic="pic3 pic4"/>
</customer>
</customers>
6. NMTOKEN与NMTOKENS型
NMTOKEN类型的属性限定属性值是有效的XML名称,这个属性值可以由英文、数字、“.”、 “_”、“-”、“:”等组成,这里有几点需要注意。
(1) 不能包括空格。
(2) 以上字符中除“:”以外,其他字符都可以作为开头字符。
(3) “:”可以出现在中间,但由于它是命名域的关键字符,所以一般不提倡使用。
7. NOTATION型
XML文档中引入了外部不可解析的实体后,解析器无法解析这些二进制文件,这时,就可以使用NOTATION类型的属性为这些二进制文件指定与其对应的应用软件以对其进行处理。

使用DTD

内部DTD
内部DTD的定义语句和XML文档在同一个文档中,且通常放置在XML文档的头部。在定义内部DTD时,定义内部DTD的语句要全部放置在文档类型声明中,其语法格式:

<!DOCTYPE  Root_Element_Name  […]>外部DTD


“`

原创粉丝点击