例如:
<?xml version=”1.0” encoding=”gb2312”?> <!DOCTYPE hr [ <!ELEMENT hr (#PCDATA)> ]> <hr>人力资源标准</hr>1.2 子元素
<?xml version=”1.0” encoding=”gb2312”?> <!DOCTYPE company [ <!ELEMENT company (employe)> <!ELEMENT employe (name, age, sex, salary, interest*, spouse?)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> <!ELEMENT sex (#PCDATA)> <!ELEMENT salary (cash | credit_card)> <!ELEMENT cash (#PCDATA)> <!ELEMENT credit_card (#PCDATA)> <!ELEMENT interest (#PCDATA)> <!ELEMENT spouse (#PCDATA)> ]> <company> <employe> <name>张三</name> <age>19</age> <sex>男</sex> <salary> <cash>2000</cash> </salary> </employe> </company>以逗号隔开的多个元素称为一个序列表示,这些元素在文档中必须严格按照这个顺序出现。
<?xml version=”1.0” encoding=”gb2312”?> <!DOCTYPE employee[ <!ELEMENT employee(#PCDATA | name)*> <!ELEMENT name(#PCDATA)> ]> <employee> 员工信息 <name>张三</name> </employee>在使用混合内容模型时,#PCDATA关键字必须是模型中的第一个选项,不能再模型中使用逗号、问号和加号。用竖线分隔的#PCDATA和元素的列表是合法的,其它用法都是不合法的。
<!ELEMENT br EMPTY> 表明br是一个没有内容的空元素。1.5 ANY
<!ELEMENT employee ANY> 表明employee可以包含任何形式的内容。在实际使用时,应该尽量避免使用ANY,一个定义明确的DTD有助于我们理清文档的结构,更好地理解文档。
<!ENTITY 实体名 “实体内容”>引用实体的方式为:“&实体名;”
<?xml version=”1.0” encoding=”gb2312”?> <!DOCTYPE website [ <!ELEMENT website (name, copyright)> <!ELEMENT name (#PCDATA)> <!ELEMENT copyright (#PCDATA)> <!ENTITY name ”鹿放青崖的空间”> <!ENTITY copyright ”© 2005,鹿放青崖的空间。All Right Reserved.”> ]> <website> <name>&name;</name> <copyright>©right;</copyright> </website>2.2 参数实体
<!ENTITY % 实体名 “实体内容”> 注意在声明时,ENTITY、%和实体名之间各有一个空格。实体的引用方式为:“%实体名;”。 参数实体引用的例子: <?xml version=”1.0” encoding=”gb2312”?> <!DOCTYPE website [ <!ELEMENT website (name, copyright)> <!ELEMENT name (#PCDATA)> <!ELEMENT copyright (#PCDATA)> <!ENTITY % name ”鹿放青崖的空间”> <!ENTITY % copyright ”© 2005,%name; All Right Reserved.”> ]> <website> <name>鹿放青崖的空间</name> <copyright>©right;</copyright> </website> ©表示版权符号( © )以上例子是不合法的,因为XML不允许在内部DTD标记声明的内部出现对参数实体的引用。对于外部的DTD子集中,在标记声明的内部允许出现对参数实体的应用。
<?xml version=”1.0” encoding=”gb2312”?> <!ELEMENT website (name, copyright)> <!ELEMENT name (#PCDATA)> <!ELEMENT copyright (#PCDATA)> <!ENTITY % name ”鹿放青崖的空间”> <!ENTITY % copyright ”© 2005,%name; All Right Reserved.”>然后我们在XML文档中,给出一个文档类型声明,使用一个SYSTEM关键字去引用一个私有的外部DTD文件:
<?xml version=”1.0” encoding=”gb2312”?> <!DOCTYPE website SYSTEM “website.dtd”> <website> <name>鹿放青崖的空间</name> <copyright>©right;</copyright> </website>如果不是在标记声明的内部,那么即使在内部DTD中的其它地方(比如在标记可以出现的地方)是可以引用参数实体的,例子如下:
<?xml version=”1.0” encoding=”gb2312”?> <!DOCTYPE website [ <!ELEMENT website (name, copyright)> <!ELEMENT name (#PCDATA)> <!ELEMENT % cprt “<!ELEMENT copyright (#PCDATA)>”> %cprt; <!ENTITY name ”鹿放青崖的空间”> <!ENTITY copyright ”© 2005,鹿放青崖的空间; All Right Reserved.”> ]> <website> <name>&name</name> <copyright>©right;</copyright> </website>注意:在内部DTD子集当中,参数实体的引用而不能在标记声明内部出现,可以在标记声明允许出现的地方出现。对于外部DTD子集,则没有这个限制。
<!ENTITY copyright SYSTEM “http://www.lfqy.org/copyright.xml”>关键字SYSTEM表明这是一个私有的外部一般实体,后面的URI称为该实体的系统标识符,用于给出外部文件的位置。
<?xml version=”1.0” encoding=”gb2312”?> ©2004,鹿放青崖的空间,All Rights Reserved.<?xml version=”1.0” encoding=”gb2312”?>称为文本声明,文本声明类似于XML声明,不过文本声明没有standalone属性,并且version属性也是可选的,外部已分析实体可以使用不同于UTF-8的编码,使用文本声明来指明实体内容的编码方式。
<?xml version=”1.0” encoding=”gb2312”?> ©2004,鹿放青崖的空间,All Rights Reserved.将以下内容保存到文件copyright.xml,在以下的xml文件中可以对这个外部实体进行引用:
<?xml version=”1.0” encoding=”gb2312”?> <!DOCTYPE website [ <!ELEMENT website (name, copyright)> <!ELEMENT name (#PCDATA)> <!ELEMENT % cprt “<!ELEMENT copyright (#PCDATA)>”> %cprt; <!ENTITY name ”鹿放青崖的空间”> <!ENTITY copyright SYSTEM “copyright.xml”> ]> <website> <name>&name</name> <copyright>©right;</copyright> </website>也可以使用PUBLIC关键字来声明公共的外部一般实体,以声明形式和使用了关键字PUBLIC的外部DTD声明类似,如下:
<!ENTITY open-hatch PUBLIC “-//Textuality//TEXT Standard open-hatch boilerplate//EN” “http://www.textuality.com/boilerplate/OpenHatch.xml”>“-//Textuality//TEXT Standard open-hatch boilerplate//EN”称为该实体的公共标识符,后面的URI部分为该实体的系统标识符。下面的例子声明了一个外部一般未分析实体。
<!ENTITY hatch-pic SYSTEM “../grafix/OpenHatch.gif” NDATA gif>与一般实体类似,参数实体的替换文本也可以位于外部文件中,其声明形式和一般实体类似。
<!ATTLIST 元素名 属性名 属性类型 缺省声明>元素名是属性所属的元素的名字,属性名是属性的命名,属性类型则用来指定该属性是属于哪种类型,共有十种类型,缺省声明用于说明在钙元素中该属性是否必须出现,如果不是必须出现,那么当该属性没有出现时,XML处理器应该如何处理。
<?xml version=”1.0” encoding=”gb2312”?> <!DOCTYPE bbs [ <!ELEMENT bbs (article*)> <!ELEMENT article (title, author)> <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> 以下是采用ATTLIST关键字进行属性表声明。 <!ATTLIST author ip CDATA #REQUIRED> ]> <bbs> <article> <title>关于属性表声明的问题</title> <author ip “192.168.1.1”>张三</author> </article> <article> <title>关于XML应用的问题</title> <author ip “192.168.1.1”>李四</author> </article> </bbs>3.1.2 #IMPLIED
<?xml version=”1.0” encoding=”gb2312”?> <!DOCTYPE bbs [ <!ELEMENT bbs (article*)> <!ELEMENT article (title, author)> <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> 以下是采用ATTLIST关键字进行属性表声明。 <!ATTLIST author ip CDATA #IMPLIED > ]> <bbs> <article> <title>关于属性表声明的问题</title> <author ip “192.168.1.1”>张三</author> </article> <article> <title>关于XML应用的问题</title> <author >李四</author> </article> </bbs>3.1.3 #FIXED+缺省值
<?xml version=”1.0” encoding=”gb2312”?> <!DOCTYPE bbs [ <!ELEMENT bbs (article*)> <!ELEMENT article (title, author)> <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> 以下是采用ATTLIST关键字进行属性表声明。 <!ATTLIST author ip CDATA #IMPLIED > <!ATTLIST article copyright CDATA #IMPIED “版权归本论坛所有”> ]> <bbs> <article> <title>关于属性表声明的问题</title> <author ip “192.168.1.1”>张三</author> </article> <article> <title>关于XML应用的问题</title> <author >李四</author> </article> </bbs>3.1.4只有缺省值
<?xml version=”1.0” encoding=”gb2312”?> <!DOCTYPE bbs [ <!ELEMENT bbs (article*)> <!ELEMENT article (title, author)> <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> 以下是采用ATTLIST关键字进行属性表声明。 <!ATTLIST author ip CDATA #IMPLIED > <!ATTLIST article copyright CDATA #IMPIED “版权归本论坛所有”> <!ATTLIST article style CDATA “txt”> ]> <bbs> <article> <title>关于属性表声明的问题</title> <author ip “192.168.1.1”>张三</author> </article> <article style “html”> <title>关于XML应用的问题</title> <author >李四</author> </article> </bbs>也可以将过个属性声明合并成一个,上面的例子可以改为:
<?xml version=”1.0” encoding=”gb2312”?> <!DOCTYPE bbs [ <!ELEMENT bbs (article*)> <!ELEMENT article (title, author)> <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> 以下是采用ATTLIST关键字进行属性表声明。 <!ATTLIST author ip CDATA #IMPLIED > <!ATTLIST article copyright CDATA #IMPIED “版权归本论坛所有” style CDATA “txt”> ]> <bbs> <article> <title>关于属性表声明的问题</title> <author ip “192.168.1.1”>张三</author> </article> <article style “html”> <title>关于XML应用的问题</title> <author >李四</author> </article> </bbs>4 属性类型
<?XML version=”1.0” encoding=”gb2312”> <!DOCTYPE company[ <!ELEMENT company (employee*)> <!ELEMENT employee (name)> <!ELEMENT name (#CDATA)> <!ATTLIST employee sn ID #REQUIED> ]> <company> <employee sn=”E-200402100001”> <name>张三</name> </employee> <company> <company> <employee sn=”E-200402100110”> <name>李四</name> </employee> <company>IDREF类型的属性值为同一文档中另一个元素的ID类型的属性值,而这另一个元素的ID类型的属性值必须是已经存在的。利用ID和IDREF这两种类型的属性,我们可以在两个对象之间建立一种关联关系。
<?XML version=”1.0” encoding=”gb2312”> <!DOCTYPE company[ <!ELEMENT company (employee|manager) *> <!ELEMENT employee (name)> <!ELEMENT manager EMPTY> <!ELEMENT name (#CDATA)> <!ATTLIST employee sn ID #REQUIED> <!ATTLIST manager mgrid IDREF #REQUIED> ]> <company> <employee sn=”E-200402100001”> <name>张三</name> </employee> <employee sn=”E-200402100110”> <name>李四</name> </employee> <manager mgrid=”E-200402100001”> </company>以上文档也可以改成以下形式:
<?XML version=”1.0” encoding=”gb2312”> <!DOCTYPE company[ <!ELEMENT company (employee*) > <!ELEMENT employee (name)> <!ELEMENT name (#CDATA)> <!ATTLIST employee sn ID #REQUIED> <!ATTLIST employee manager IDREF #IMPLIED>意思是可有可无 ]> <company> <employee sn=”E-200402100001”> <name>张三</name> </employee> <employee sn=”E-200402100110” manager=”E-200402100001”> <name>李四</name> </employee> <employee sn=”E-200402100111” manager=”E-200402100001”> <name>王五</name> </employee> </company>如果一个属性需要引用文档中多个ID类型的属性值,那么可以把它声明为具有IDREFS类型。IDREFS类型的属性值是一系列以空格分隔的ID类型的属性值,而且必须与文档中已有的ID类型属性值相匹配。
<?XML version=”1.0” encoding=”gb2312”> <!DOCTYPE library[ <!ELEMENT library (books, records) > <!ELEMENT books (book+)> <!ELEMENT book (#CDATA)> <!ELEMENT records (term*)> <!ELEMENT term (date, person)> <!ELEMENT date (#CDATA)> <!ELEMENT person EMPTY> <!ATTLIST book bookid ID #REQUIED> <!ATTLIST person name CDATA #REQUIED> <!ATTLIST book borrowed IDREFS #REQUIED> <!ATTLIST employee manager IDREF #IMPLIED>意思是可有可无 ]> <library> <books> <book bookid=”b-1-1”>XML详解</book> <book bookid=”b-1-2”>Servlet从入门到精通</book> <book bookid=”b-1-3”>JSP实例编程</book> </books> <records> <term> <date>2004-3-14<date> <person name=”张三” borrowed=” b-1-1 b-1-2”> <term> <term> <date>2004-5-15<date> <person name=”李四” borrowed=” b-1-1 b-1-2 b-1-3”> <term> </records> </library>4.4 ENTITY、ENTITIES
<!ATTLIST image src ENTITY #REQUIRED>在DTD中,还需要声明一个外部的一般实体:
<ENTITY logo SYSTEM “http://www.lfqy.org/logo.gif” NDATA gif>关键字NDATA表示该实体是一般未分析的实体,后面的gif是记号名称(notation name),说明实体的数据格式或指定一个外部的处理程序。记号为gif的声明如下:
<!NOTATION gif SYSTEM “iexplore.exe”>在XML文档中,可以在src属性中引用图像:
<image src=”logo”/>这句代码将http://www.lfqy.org/logo.gif文件与image元素关联在一起。
<!ENTITY banner SYSTEM “http://www.lfqy.com.cn/banner.gif” NDATA gif>然后将元素image的属性声明改为:
<!ATTLIST image src ENTITIES #REQUIRED>在XML文档中,通过src属性引用两幅图像:
<image src=”logo banner”/>4.5 NMTOKEN、NMTOKENS、NOTATION
<!ATTLIST file name NMTOKEN #REQUIRED>在文档中,可以按如下方式使用name属性:
<file name=”XML讲座.doc”>因为name属性的类型是NMTOKEN,所以在用文件名给name属性赋值的时候,在文件名中不能包含有空格。
<!ATTLIST files name NMTOKENS #REQUIRED>在文档中使用:
<file name=”XML讲座.doc JSP讲座.doc”/>有时候,你可能会用NMTOKEN类型的属性来让用户输入特定的值,但是要注意的是:在使用NMTOKEN类型的属性时,其值是否有效,需要文档的作者自己去保证,XML处理器只能确保名称是合法的(也就是检查名称中有没有空格),而不会检查值的有效性。
<!NOTATION gif SYSTEM “image/gif”>另一种是使用URI路径,指出外部处理程序的位置,如下:
<!NOTATION gif SYSTEM “iexplore.exe”>对于记号的声明,也可以使用PUBLIC关键字来代替SYSTEM关键字,并添加公共的名称和URI(用法类似于使用了关键字PUBLIC的外部DTD声明)。
<?xml version=”1.0” encoding=”gb2312”?> <!DOCTYPE webpage[ <!ELEMENT webpage (image)> <!ELEMENT image (src)> <!ELEMENT src (#PCDATA)> <!NOTATION gif SYSTEM “image/gif”> <!NOTATION jpg SYSTEM “explore.exe”> <!ATTLIST image type NOTATION (gif|jpg) #REQUIRED> ]> <webpage> <image type=”jpg”> <src>http://www.lfqy.org/images/photo.jpg</src> </image> </webpage>