+DTD Language
http://www.w3schools.com/dtd/dtd_intro.asp
-XML DTD 全称:Document Type Definition
简介:用于定义文档的合法性。它定义了文档应该有哪些元素及其属性,还有其他一些约束性规则。
注意:DTD语言定义的文档类型是SGML家族的标记性语言。包括SGML,XML,HTML),这里探讨的知识定义XML的DTD。
+DTD可以定义在XML里,也可以定义在一个单独的文件里。
+内部定义:内部的DTD定义必须定义在一个DOCTYPE元素里,格式如下:
<!DOCTYPE root-element [element-declarations]>
-一个内部定义DTD的XML例子:
<?xml version="1.0"?>
<!-- Edited by XMLSpy? -->
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
+外部定义:如果一个DTD定义在一个单独的DTD文件里,则XML文件引用定义DTD文件格式如下:
<!DOCTYPE root-element SYSTEM "dtdfilename">
-举例如下:
XML文件:
demo.xml
<?xml version="1.0"?>
<!-- Edited by XMLSpy? -->
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
DTD文件:
note.dtd
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
+关于DOCTYPE
http://xmlwriter.net/xml_guide/doctype_declaration.shtml
+DOCTYPE声明由内部或者外部DTD引用组成。
+内部DTD
-格式如下:
<!DOCTYPE root-element [element-declarations]>
-举例如下:
<?xml version="1.0" standalone="yes" ?>
<!--open the DOCTYPE declaration -
the open square bracket indicates an internal DTD-->
<!DOCTYPE foo [
<!--define the internal DTD-->
<!ELEMENT foo (#PCDATA)>
<!--close the DOCTYPE declaration-->
]>
<foo>Hello World.</foo>
-规则:
1)在一个XML文档中,文档类型声明必须放在XML声明和第一个元素(根元素)之间。
2)关键字DOCTYPE后跟的必须是这个XML文档的根元素名。
3)关键字DOCTYPE必须大写。
+外部DTD
-外部DTD用来定义一个通用的DTD以便可以被多个文档使用。
+有两种类型的外部DTD:private和public
-如果XML文档里有任何元素或实体引用了外部DTD或在外部DTD中定义了,则XML声明中必须指定standalone="no"
+私有的外部DTD
-私有的外部DTD用SYSTEM标示。它指明这个DTD被单个人或组织使用
+语法:
<!DOCTYPE root_element SYSTEM "DTD_location">
-DTD_location 可以使相对URL也可以是绝对URL
-Example:
<!--inform the XML processor
that an external DTD is referenced-->
<?xml version="1.0" standalone="no" ?>
<!--define the location of the
external DTD using a relative URL address-->
<!DOCTYPE document SYSTEM "subjects.dtd">
<document>
<title>Subjects available in Mechanical Engineering.</title>
<subjectID>2.303</subjectID>
<subjectname>Fluid Mechanics</subjectname>
<prerequisite>
<subjectID>1.001</subjectID>
<subjectname>Mathematics</subjectname>
</prerequisite>
<classes>4 hours per week (lectures and tutorials) for one
semester.</classes>
<assessment>tutorial assignments and one 2hr exam at end of
course.</assessment>
<syllabus>
Fluid statics. The Bernoulli equation. Energy equation. Momentum
equation. Differential Continuity equation. Differential Energy
equation. Differential Momentum equation. Dimensional Analysis.
Similitude. Laminar flow. Turbulent flow. Lift and Drag. Boundary
layer theory.
</syllabus>
<textbooks>
<author>Foobar</author>
<booktitle>The Study of Fluid Mechanics</booktitle>
</textbooks>
</document>
subjects.dtd:
<!--see Element Type Declarations
for an explanation of the following syntax-->
<!ELEMENT document
(title*,subjectID,subjectname,prerequisite?,
classes,assessment,syllabus,textbooks*)>
<!ELEMENT prerequisite (subjectID,subjectname)>
<!ELEMENT textbooks (author,booktitle)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT subjectID (#PCDATA)>
<!ELEMENT subjectname (#PCDATA)>
<!ELEMENT classes (#PCDATA)>
<!ELEMENT assessment (#PCDATA)>
<!ATTLIST assessment assessment_type (exam | assignment) #IMPLIED>
<!ELEMENT syllabus (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT booktitle (#PCDATA)>
+公共的外部DTD
-公共的外部DTD用PUBLIC标示。它代表这个DTD有广泛的应用。
+格式如下:
<!DOCTYPE root_element PUBLIC "DTD_name" "DTD_location">
+DTD_location:相对或绝对路径
+DTD_name:遵循如下语法:
"prefix//owner_of_the_DTD//
description_of_the_DTD//ISO 639_language_identifier"
-prefix允许以下值:
ISO The DTD is an ISO standard. All ISO standards are approved.
+ The DTD is an approved non-ISO standard.
- The DTD is an unapproved non-ISO standard.
-如果不能根据DTD_name知道这个DTD文件,则用DTD_location来寻找这个公共的DTD
-Example:
<?xml version="1.0" standalone="no" ?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
"http://www.w3.org/TR/REC-html40/loose.dtd">
<HTML>
<HEAD>
<TITLE>A typical HTML file</TITLE>
</HEAD>
<BODY>
This is the typical structure of an HTML file. It follows
the notation of the HTML 4.0 specification, including tags
that have been deprecated (hence the "transitional" label).
</BODY>
</HTML>
+合并内部DTD和外部DTD
+一个文档可以在DOCTYPE声明中同时使用内部DTD和外部DTD,内部DTD定义放在方括号里。外部DTD放在方括号前面,SYSTEM后面。
-Example:
<!--inform the XML processor
that an external DTD is referenced-->
<?xml version="1.0" standalone="no" ?>
<!--define the location of the
external DTD using a relative URL address - the open square
bracket indicates an internal DTD-->
<!DOCTYPE document SYSTEM "subjects.dtd" [
<!--the markup in the internal DTD
takes precedence over the external DTD-->
<!ATTLIST assessment assessment_type (exam | assignment | prac)>
<!ELEMENT results (#PCDATA)>
<!--close the DOCTYPE declaration-->
]>
-subjects.dtd:
<!ELEMENT document
(title*,subjectID,subjectname,prerequisite?,
classes,assessment,syllabus,textbooks*)>
<!ELEMENT prerequisite (subjectID,subjectname)>
<!ELEMENT textbooks (author,booktitle)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT subjectID (#PCDATA)>
<!ELEMENT subjectname (#PCDATA)>
<!ELEMENT classes (#PCDATA)>
<!ELEMENT assessment (#PCDATA)>
<!ATTLIST assessment assessment_type (exam | assignment) #IMPLIED>
<!ELEMENT syllabus (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT booktitle (#PCDATA)>
-注意:在内部DTD和外部DTD中同时定义具有相同名称的元素是非法的。
-为什么要用DTD:
1)通过DTD,可以使XML文件的格式有明确的描述。
2)不同的组织和个人可以使用一个标准的DTD规范来交换XML数据。
3)你可以使用一个DTD来验证XML格式是否合法。
4)...
+所有的XML或HTML文档都是由以下部分组成,我们称之为构建块(building block)
-Element标签元素:XML或HTML文档的主要构建块。比如HTML里的<BODY> <TABLE>,<BR>,<HR>等
-Attribute标签元素的属性。它为标签元素提供了额外的信息。属性一般放在标签元素的开始标记里。以名/值对的形式出现。
-ENTITY 实体元素。有些字符有特殊的意义,比如小于号(<)定义一个标签元素的开始。最常见的" "就是一个实体,HTML用它来在文档里插入一个空格。XML解析器在解析文档时遇到实体会将其展开。以下几个实体是XML预定义的实体:"<"代表小括号(<),(>)代表大括号(>),(&)代表连接符(&),(")代表双引号("),,(')代表单引号(')。
+PCDATA 需要被解析的XML内容。考虑下字符中包含带有开始标记和结束标记的XML元素。PCDATA代表的文本应该被XML解析器解析,解析器应该能识别文本里的XML标记或实体。PCDATA里不应该包含任何的(&),(<)或(>)字符,应该使用(&)、(<) 及 (>)代替它们。
-PCDATA是否可以包含CDATA?
+CDATA 不需要被解析的文本内容。它就代表纯文本的字符数据。
-是否可以包含< > & 等?
+Element
-在DTD里,标签元素使用 ELEMENT 进行声明,格式如下:
<!ELEMENT element-name category>
或
<!ELEMENT element-name (element-content)>
+空元素使用EMPTY关键字指明,格式如下:
<!ELEMENT element-name EMPTY>
例如:
<!ELEMENT br EMPTY>
XML举例:
<br />
-EMPTY类型的元素是可以带属性的,只是不能有子元素。
-带有需被解析的XML数据的标签元素使用#PCDATA指明,它被包含在圆括号里,格式如下:
<!ELEMENT element-name (#PCDATA)>
例如:
<!ELEMENT from (#PCDATA)>
+允许带有任何内容的标签元素使用ANY指明,格式如下:
<!ELEMENT element-name ANY>
举例例如
<!ELEMENT note ANY>
-ANY 只哪些?是否包含其他各种情况比如EMPTY情况?
+定义带有特定子元素的标签元素,格式如下:
<!ELEMENT element-name (child1)>
或
<!ELEMENT element-name (child1,child2,...)>
举例:
<!ELEMENT note (to,from,heading,body)>
它除了定义应该包含且只能包含哪些元素外,还定义子元素出现的顺序以及允许出现的个数。
-子元素只能出现一次,格式如下:
<!ELEMENT element-name (child-name)>
举例:
<!ELEMENT note (message)>
-子元素至少出现一次,格式如下:
<!ELEMENT element-name (child-name+)>
Example:
<!ELEMENT note (message+)>
-子元素可以不出现或者出现多次,格式如下:
<!ELEMENT element-name (child-name*)>
举例:
<!ELEMENT note (message*)>
-子元素出现零次或一次,格式如下:
<!ELEMENT element-name (child-name?)>
举例:
<!ELEMENT note (message?)>
-允许在几个子元素中选择一个,格式如下:
<!ELEMENT element-name((child1-name|child2-name))>
举例:
<!ELEMENT note (to,from,header,(message|body))>
-更加自由的组合:
<!ELEMENT note (#PCDATA|to|from|header|message)*>
子元素可以包含以下元素任意次数,也可以什么都不包含,且顺序随意。
PCDATA
to
from
header
message
+Attribute
+元素的属性用ATTLIST定义,语法如下:
<!ATTLIST element-name attribute-name attribute-type default-value>
-element-name代表标签元素,属性就是为了定义这个标签元素。
-attribute-name代表定义的属性名字。
+attribute-type定义了属性的类型,可以使以下任意一种
+CDATA:值是一个字符串
-所有的内容最终都会变成文本。当属性值为纯文本时,你可以将该属性声明为CDATA类型。
该属性的值可以是任意长度的字符串。唯一的限制是它不能包含标记。上述声明可以有以下实例:只要属性值是纯文本,解析器都会将它视作有效。
+ID:值是一个唯一标示符
-对于ID类型的属性,其值必然是具有唯一标识功能的名称。而且它们必须遵守XML名称定义的规则。特定元素的ID属性值在整个文档中必须是唯一的。它可以作为元素的唯一标识符。每个元素至多有一个ID类型的属性。
-ID类型的属性必须设置为#IMPLIED或#REQUIED,不能是#FIXED或缺省的。可想而知,为ID提供缺省值,特别是固定的缺省值是毫无意义的。这会破坏ID的唯一性。
+IDREF:值是另一个元素的ID
-IDREF类型可以用于在文档中创建链接和交叉引用。IDREF属性的值必须受到与ID类型同样的约束。它们必须与文档中的某个ID属性具有相同的值。 IDREF值不能指向文档中不存在的ID。
+IDREFS:值是其他ID的列表,用空格分隔
-有时,我们希望将一个元素与其他多个元素相关联。这就要依靠IDREFS类型。它能够建立一对多的关系。这类属性的值是一系列以空格分隔的ID值。其中每个ID必须满足对ID类型的约束,当然它们必须与文档中的ID属性值相匹配。
+(en1|en2|。。):值是en1、en2、。。。等枚举中的任意一个
-某些情况下,您可能希望将属性值作为离散的记号,而不是文本。为此我们可以使用枚举类型。
+NMTOKEN:值是一个有效的XML名
-NMTOKEN全称:Name Token 名称标记,NMTOKEN类型必须遵守元素名称的命名规则,但是其中一项限制除外。它们只能包含字母、数字、冒号、句点和连字符。
然而,与元素和属性名称不同的是,NMTOKEN的第一个字符可以是任意字符。
-NMTOKEN类型使得应用程序必须承担验证值有效性的任务。然而对于枚举类型,解析器能够提供有效性检查。
+NMTOKENS:值是有效XML名列表,用空格分隔
-跟IDREF和IDREFS的关系一样
+ENTITY:值是一个实体名
-对于多次出现的结构,可以为结构定义一个实体,然后通过引用实体来实现对结构的调用。
-DTD举例:
<!ATTLIST SalesResults month_graph ENTITY #IMPLIED>
DTD中声明实体:
<!ENTITY sales_chart SYSTEM "sales_chart.gif" NDATA gif>
XML中:
<SalesResults month_graph="sales_chart"> ... </SaleResultes>
+ENTITYS:值是实体列表,用空格分隔
-跟IDREF和IDREFS的关系一样
+NOTATION:值是一个NOTATION的名称
+http://www.quackit.com/xml/tutorial/dtd_attribute_types_notation.cfm
-声明NOTATION类型的属性格式如下:
<!ATTLIST element_name attribute_name NOTATION default_value>
-举例如下:
<!NOTATION GIF SYSTEM "image/gif">
<!NOTATION JPG SYSTEM "image/jpeg">
<!NOTATION PNG SYSTEM "image/png">
<!ATTLIST mountain
photo ENTITY #IMPLIED
photo_type NOTATION (GIF | JPG | PNG) #IMPLIED>
<!ENTITY mt_cook_1 SYSTEM "mt_cook1.jpg">
这段代码说明photo_type属性值只能是GIF,JPG,PNG三个中的一个。以下XML是合法的:‘
<mountains>
<mountain photo="mt_cook_1" photo_type="JPG">
<name>Mount Cook</name>
</mountain>
<mountain>
<name>Cradle Mountain</name>
</mountain>
</mountains>
+default-value可以是value,#REQUIRED,#IMPLIED,#FIXED value
+value:一个默认的value值
-举例:
DTD:
<!ELEMENT square EMPTY>
<!ATTLIST square width CDATA "0">
XML中:
<square width="100" />
在上面的例子中,square元素被定义成一个空元素并带有width属性,属性类型为CDATA,如果width的值没有指定,其默认的值为0。
+#REQUIRED:必须有此属性值
-语法:
<!ATTLIST element-name attribute-name attribute-type #REQUIRED>
-举例:
DTD:
<!ATTLIST person number CDATA #REQUIRED>
Valid XML:
<person number="5677" />
Invalid XML:
<person />
-如果你没有默认值但又要求此属性不许指定值,用#REQUIRED
+#IMPLIED:此属性值不是必须的
-语法:
<!ATTLIST element-name attribute-name attribute-type #IMPLIED>
-举例:
DTD:
<!ATTLIST contact fax CDATA #IMPLIED>
Valid XML:
<contact fax="555-667788" />
Valid XML:
<contact />
-如果这个属性不是必须的,且没有默认值可以指定,用#IMPLIED
+#FIXED value:一个固定的value值
-语法:
<!ATTLIST element-name attribute-name attribute-type #FIXED "value">
-举例:
DTD:
<!ATTLIST sender company CDATA #FIXED "Microsoft">
Valid XML:
<sender company="Microsoft" />
Invalid XML:
<sender company="W3Schools" />
-如果你想为指定一个固定的值并且不允许XML作者修改它,用@FIXED value
+还有一种是枚举值
-格式如下:
<!ATTLIST element-name attribute-name (en1|en2|..) default-value>
-举例:
DTD:
<!ATTLIST payment type (check|cash) "cash">
XML example:
<payment type="check" />
or
<payment type="cash" />
+什么时候用element什么时候用attribute
-XML没有规定什么时候改用element什么时候改用attribute
+数据即可没存储在element里也可被存储在attribute里
-举例:
sex存贮在attribute里
<person sex="female">
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>
sex存储在element里
<person>
<sex>female</sex>
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>
+建议尽量将数据放到element里
+用attribute的弊端
-attribute不能存储多个值
-attribute不容易扩展
-attribute不能描述结构
-attribute不容易被程序处理
-attribute不容易被DTD校验
-用attribute:
<note date="12/11/2002">
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
用element
<note>
<date>12/11/2002</date>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
扩展element
<note>
<date>
<day>12</day>
<month>11</month>
<year>2002</year>
</date>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
+Entity
-Entity相当于一个变量,用于定义一个标准文本数据或特殊字符。
-Entity引用指向一个Entity对象
+Entity对象可以是一个内部实体(指向内部数据)也可以是一个外部实体(指向外部数据)
+内部实体
+定义内部实体的语法:
<!ENTITY entity-name "entity-value">
-举例:
DTD Example:
<!ENTITY writer "Donald Duck.">
<!ENTITY copyright "Copyright W3Schools.">
XML example:
<author>&writer;©right;</author>
-一个Entity实体引用由三个部分组成:与号(&),实体名,分号(;)
+外部实体
+定义外部实体的语法:
<!ENTITY entity-name SYSTEM "URI/URL">
-举例:
DTD Example:
<!ENTITY writer SYSTEM "http://www.w3schools.com/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.w3schools.com/entities.dtd">
XML example:
<author>&writer;©right;</author>
+还有一种Entity称为参数实体
-它也和实体引用一样,您可以直接在 XML 文档内定义参数实体,或将其放在单独的 DTD 中。
-它专门在DTD文件里使用,不被XML使用,它主要用来在DTD中定义变量。其作用跟实体是一样的。
-一个简单的参数实体:
<!ENTITY % common.attributes
'id ID #IMPLIED
account CDATA #REQUIRED'
>
-以上是一个较严格的文本替换。在这个例子中,定义了两个属性,约束集中全部或大多数元素都应该具有这两个属性。您随后可以在 DTD 中定义那些元素
-<!ELEMENT purchaseOrder (item+, manufacturer, purchaser, purchaseInfo)>
<!ATTLIST purchaseOrder %common.attributes;>
<!ELEMENT item (price, quantity)>
<!ATTLIST item %common.attributes;>
<!ELEMENT manufacturer (#PCDATA)>
<!ATTLIST manufacturer %common.attributes;>
<!ELEMENT purchaser (#PCDATA)>
<!ATTLIST purchaser %common.attributes;>
<!ELEMENT purchaseInfo (creditCard | check | cash)>
-每个元素都使用 common.attributes 参数实体,该参数实体会被转换成示例中的字符串(包括 id 和 account 属性)以用于每个属性列表。和实体引用一样,更改参数实体的值会更改对所有元素的定义。此外,这一技术应该能整理您的 XML 文档及其 DTD 的组织。
-由于当 DTD 有大量带共同数据的元素时通常都使用参数实体,所以最好把它们放在单独的 DTD 中 — 对于参数实体,如果您有足够的数据类型,那么您可能就有足够的数据类型使用独立的 DTD。
+NOTATION
http://infohost.nmt.edu/tcc/help/pubs/dtd/notation-sect.html
-NOTATION声明的作用是定义非XML文件及其处理器,比如一个声音文件或一个图像文件,这样你就可以再XML文档中引用这些文件。
+它的通用格式如下:
<!NOTATION nname PUBLIC std>
<!NOTATION nname SYSTEM url>
-nname是这个notation的名字
std是一个公共notation的名字
url是指向一个处理这个文件的处理路径。
-最常用的是用它来描述MIME类型,比如:image/gif,image/jpeg 等。
+使用方法
+1.定义NOTATION
-<!NOTATION jpeg PUBLIC "JPG 1.0">
+2.定义实体
- <!ENTITY bogie-pic SYSTEM
"http://stars.com/bogart.jpg" NDATA jpeg>
+3.声明元素属性的类型是这个实体
-<!ATTLIST star-bio pin-shot ENTITY #REQUIRED>
+4.在XML中的具体使用
- <star-bio pin-shot="bogie-pic">...</star-bio>
+NOTATION 2
http://webdesign.about.com/od/dtds/a/aa101700b.htm
-在XML中尼可以定义一些非XML的数据,这需要借助NOTATION,它描述了这些数据的格式并且帮助你的应用程序识别并处理它。
+格式如下:
+<!NOTATION name system "external_ID">
+name指明了文件的格式,external_id标示这个notation,通常是一个MIME类型。
-比如下面这个例子,它在XML里定义了一个GIF图像:
<!NOTATION GIF system "image/gif">
+你也可以使用PUBLIC标记来代替SYSTEM。你需要在NOTATION里包含PUBLIC ID和URI。
-比如:
<!NOTATION GIF public
"-//IETF/NOSGML Media Type image/gif//EN"
"http://www.isi.edu/in-notes/iana/assignments/media-types/image/gif">
+XML验证
-可以用IE浏览器验证XML是否符合DTD定义规范
+JavaScript验证:
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async="false";
xmlDoc.validateOnParse="true";
xmlDoc.load("note_dtd_error.xml");
document.write("<br />Error Code: ");
document.write(xmlDoc.parseError.errorCode);
document.write("<br />Error Reason: ");
document.write(xmlDoc.parseError.reason);
document.write("<br />Error Line: ");
document.write(xmlDoc.parseError.line);
-load()方法用于加载文件,laodXML()方法用于加载文本字符串。
+给解析器加上validateOnParse="false"可以关闭DTD验证
-举例:
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async="false";
xmlDoc.validateOnParse="false";
xmlDoc.load("note_dtd_error.xml");
document.write("<br />Error Code: ");
document.write(xmlDoc.parseError.errorCode);
document.write("<br />Error Reason: ");
document.write(xmlDoc.parseError.reason);
document.write("<br />Error Line: ");
http://www.w3schools.com/dtd/dtd_intro.asp
-XML DTD 全称:Document Type Definition
简介:用于定义文档的合法性。它定义了文档应该有哪些元素及其属性,还有其他一些约束性规则。
注意:DTD语言定义的文档类型是SGML家族的标记性语言。包括SGML,XML,HTML),这里探讨的知识定义XML的DTD。
+DTD可以定义在XML里,也可以定义在一个单独的文件里。
+内部定义:内部的DTD定义必须定义在一个DOCTYPE元素里,格式如下:
<!DOCTYPE root-element [element-declarations]>
-一个内部定义DTD的XML例子:
<?xml version="1.0"?>
<!-- Edited by XMLSpy? -->
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
+外部定义:如果一个DTD定义在一个单独的DTD文件里,则XML文件引用定义DTD文件格式如下:
<!DOCTYPE root-element SYSTEM "dtdfilename">
-举例如下:
XML文件:
demo.xml
<?xml version="1.0"?>
<!-- Edited by XMLSpy? -->
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
DTD文件:
note.dtd
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
+关于DOCTYPE
http://xmlwriter.net/xml_guide/doctype_declaration.shtml
+DOCTYPE声明由内部或者外部DTD引用组成。
+内部DTD
-格式如下:
<!DOCTYPE root-element [element-declarations]>
-举例如下:
<?xml version="1.0" standalone="yes" ?>
<!--open the DOCTYPE declaration -
the open square bracket indicates an internal DTD-->
<!DOCTYPE foo [
<!--define the internal DTD-->
<!ELEMENT foo (#PCDATA)>
<!--close the DOCTYPE declaration-->
]>
<foo>Hello World.</foo>
-规则:
1)在一个XML文档中,文档类型声明必须放在XML声明和第一个元素(根元素)之间。
2)关键字DOCTYPE后跟的必须是这个XML文档的根元素名。
3)关键字DOCTYPE必须大写。
+外部DTD
-外部DTD用来定义一个通用的DTD以便可以被多个文档使用。
+有两种类型的外部DTD:private和public
-如果XML文档里有任何元素或实体引用了外部DTD或在外部DTD中定义了,则XML声明中必须指定standalone="no"
+私有的外部DTD
-私有的外部DTD用SYSTEM标示。它指明这个DTD被单个人或组织使用
+语法:
<!DOCTYPE root_element SYSTEM "DTD_location">
-DTD_location 可以使相对URL也可以是绝对URL
-Example:
<!--inform the XML processor
that an external DTD is referenced-->
<?xml version="1.0" standalone="no" ?>
<!--define the location of the
external DTD using a relative URL address-->
<!DOCTYPE document SYSTEM "subjects.dtd">
<document>
<title>Subjects available in Mechanical Engineering.</title>
<subjectID>2.303</subjectID>
<subjectname>Fluid Mechanics</subjectname>
<prerequisite>
<subjectID>1.001</subjectID>
<subjectname>Mathematics</subjectname>
</prerequisite>
<classes>4 hours per week (lectures and tutorials) for one
semester.</classes>
<assessment>tutorial assignments and one 2hr exam at end of
course.</assessment>
<syllabus>
Fluid statics. The Bernoulli equation. Energy equation. Momentum
equation. Differential Continuity equation. Differential Energy
equation. Differential Momentum equation. Dimensional Analysis.
Similitude. Laminar flow. Turbulent flow. Lift and Drag. Boundary
layer theory.
</syllabus>
<textbooks>
<author>Foobar</author>
<booktitle>The Study of Fluid Mechanics</booktitle>
</textbooks>
</document>
subjects.dtd:
<!--see Element Type Declarations
for an explanation of the following syntax-->
<!ELEMENT document
(title*,subjectID,subjectname,prerequisite?,
classes,assessment,syllabus,textbooks*)>
<!ELEMENT prerequisite (subjectID,subjectname)>
<!ELEMENT textbooks (author,booktitle)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT subjectID (#PCDATA)>
<!ELEMENT subjectname (#PCDATA)>
<!ELEMENT classes (#PCDATA)>
<!ELEMENT assessment (#PCDATA)>
<!ATTLIST assessment assessment_type (exam | assignment) #IMPLIED>
<!ELEMENT syllabus (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT booktitle (#PCDATA)>
+公共的外部DTD
-公共的外部DTD用PUBLIC标示。它代表这个DTD有广泛的应用。
+格式如下:
<!DOCTYPE root_element PUBLIC "DTD_name" "DTD_location">
+DTD_location:相对或绝对路径
+DTD_name:遵循如下语法:
"prefix//owner_of_the_DTD//
description_of_the_DTD//ISO 639_language_identifier"
-prefix允许以下值:
ISO The DTD is an ISO standard. All ISO standards are approved.
+ The DTD is an approved non-ISO standard.
- The DTD is an unapproved non-ISO standard.
-如果不能根据DTD_name知道这个DTD文件,则用DTD_location来寻找这个公共的DTD
-Example:
<?xml version="1.0" standalone="no" ?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
"http://www.w3.org/TR/REC-html40/loose.dtd">
<HTML>
<HEAD>
<TITLE>A typical HTML file</TITLE>
</HEAD>
<BODY>
This is the typical structure of an HTML file. It follows
the notation of the HTML 4.0 specification, including tags
that have been deprecated (hence the "transitional" label).
</BODY>
</HTML>
+合并内部DTD和外部DTD
+一个文档可以在DOCTYPE声明中同时使用内部DTD和外部DTD,内部DTD定义放在方括号里。外部DTD放在方括号前面,SYSTEM后面。
-Example:
<!--inform the XML processor
that an external DTD is referenced-->
<?xml version="1.0" standalone="no" ?>
<!--define the location of the
external DTD using a relative URL address - the open square
bracket indicates an internal DTD-->
<!DOCTYPE document SYSTEM "subjects.dtd" [
<!--the markup in the internal DTD
takes precedence over the external DTD-->
<!ATTLIST assessment assessment_type (exam | assignment | prac)>
<!ELEMENT results (#PCDATA)>
<!--close the DOCTYPE declaration-->
]>
-subjects.dtd:
<!ELEMENT document
(title*,subjectID,subjectname,prerequisite?,
classes,assessment,syllabus,textbooks*)>
<!ELEMENT prerequisite (subjectID,subjectname)>
<!ELEMENT textbooks (author,booktitle)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT subjectID (#PCDATA)>
<!ELEMENT subjectname (#PCDATA)>
<!ELEMENT classes (#PCDATA)>
<!ELEMENT assessment (#PCDATA)>
<!ATTLIST assessment assessment_type (exam | assignment) #IMPLIED>
<!ELEMENT syllabus (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT booktitle (#PCDATA)>
-注意:在内部DTD和外部DTD中同时定义具有相同名称的元素是非法的。
-为什么要用DTD:
1)通过DTD,可以使XML文件的格式有明确的描述。
2)不同的组织和个人可以使用一个标准的DTD规范来交换XML数据。
3)你可以使用一个DTD来验证XML格式是否合法。
4)...
+所有的XML或HTML文档都是由以下部分组成,我们称之为构建块(building block)
-Element标签元素:XML或HTML文档的主要构建块。比如HTML里的<BODY> <TABLE>,<BR>,<HR>等
-Attribute标签元素的属性。它为标签元素提供了额外的信息。属性一般放在标签元素的开始标记里。以名/值对的形式出现。
-ENTITY 实体元素。有些字符有特殊的意义,比如小于号(<)定义一个标签元素的开始。最常见的" "就是一个实体,HTML用它来在文档里插入一个空格。XML解析器在解析文档时遇到实体会将其展开。以下几个实体是XML预定义的实体:"<"代表小括号(<),(>)代表大括号(>),(&)代表连接符(&),(")代表双引号("),,(')代表单引号(')。
+PCDATA 需要被解析的XML内容。考虑下字符中包含带有开始标记和结束标记的XML元素。PCDATA代表的文本应该被XML解析器解析,解析器应该能识别文本里的XML标记或实体。PCDATA里不应该包含任何的(&),(<)或(>)字符,应该使用(&)、(<) 及 (>)代替它们。
-PCDATA是否可以包含CDATA?
+CDATA 不需要被解析的文本内容。它就代表纯文本的字符数据。
-是否可以包含< > & 等?
+Element
-在DTD里,标签元素使用 ELEMENT 进行声明,格式如下:
<!ELEMENT element-name category>
或
<!ELEMENT element-name (element-content)>
+空元素使用EMPTY关键字指明,格式如下:
<!ELEMENT element-name EMPTY>
例如:
<!ELEMENT br EMPTY>
XML举例:
<br />
-EMPTY类型的元素是可以带属性的,只是不能有子元素。
-带有需被解析的XML数据的标签元素使用#PCDATA指明,它被包含在圆括号里,格式如下:
<!ELEMENT element-name (#PCDATA)>
例如:
<!ELEMENT from (#PCDATA)>
+允许带有任何内容的标签元素使用ANY指明,格式如下:
<!ELEMENT element-name ANY>
举例例如
<!ELEMENT note ANY>
-ANY 只哪些?是否包含其他各种情况比如EMPTY情况?
+定义带有特定子元素的标签元素,格式如下:
<!ELEMENT element-name (child1)>
或
<!ELEMENT element-name (child1,child2,...)>
举例:
<!ELEMENT note (to,from,heading,body)>
它除了定义应该包含且只能包含哪些元素外,还定义子元素出现的顺序以及允许出现的个数。
-子元素只能出现一次,格式如下:
<!ELEMENT element-name (child-name)>
举例:
<!ELEMENT note (message)>
-子元素至少出现一次,格式如下:
<!ELEMENT element-name (child-name+)>
Example:
<!ELEMENT note (message+)>
-子元素可以不出现或者出现多次,格式如下:
<!ELEMENT element-name (child-name*)>
举例:
<!ELEMENT note (message*)>
-子元素出现零次或一次,格式如下:
<!ELEMENT element-name (child-name?)>
举例:
<!ELEMENT note (message?)>
-允许在几个子元素中选择一个,格式如下:
<!ELEMENT element-name((child1-name|child2-name))>
举例:
<!ELEMENT note (to,from,header,(message|body))>
-更加自由的组合:
<!ELEMENT note (#PCDATA|to|from|header|message)*>
子元素可以包含以下元素任意次数,也可以什么都不包含,且顺序随意。
PCDATA
to
from
header
message
+Attribute
+元素的属性用ATTLIST定义,语法如下:
<!ATTLIST element-name attribute-name attribute-type default-value>
-element-name代表标签元素,属性就是为了定义这个标签元素。
-attribute-name代表定义的属性名字。
+attribute-type定义了属性的类型,可以使以下任意一种
+CDATA:值是一个字符串
-所有的内容最终都会变成文本。当属性值为纯文本时,你可以将该属性声明为CDATA类型。
该属性的值可以是任意长度的字符串。唯一的限制是它不能包含标记。上述声明可以有以下实例:只要属性值是纯文本,解析器都会将它视作有效。
+ID:值是一个唯一标示符
-对于ID类型的属性,其值必然是具有唯一标识功能的名称。而且它们必须遵守XML名称定义的规则。特定元素的ID属性值在整个文档中必须是唯一的。它可以作为元素的唯一标识符。每个元素至多有一个ID类型的属性。
-ID类型的属性必须设置为#IMPLIED或#REQUIED,不能是#FIXED或缺省的。可想而知,为ID提供缺省值,特别是固定的缺省值是毫无意义的。这会破坏ID的唯一性。
+IDREF:值是另一个元素的ID
-IDREF类型可以用于在文档中创建链接和交叉引用。IDREF属性的值必须受到与ID类型同样的约束。它们必须与文档中的某个ID属性具有相同的值。 IDREF值不能指向文档中不存在的ID。
+IDREFS:值是其他ID的列表,用空格分隔
-有时,我们希望将一个元素与其他多个元素相关联。这就要依靠IDREFS类型。它能够建立一对多的关系。这类属性的值是一系列以空格分隔的ID值。其中每个ID必须满足对ID类型的约束,当然它们必须与文档中的ID属性值相匹配。
+(en1|en2|。。):值是en1、en2、。。。等枚举中的任意一个
-某些情况下,您可能希望将属性值作为离散的记号,而不是文本。为此我们可以使用枚举类型。
+NMTOKEN:值是一个有效的XML名
-NMTOKEN全称:Name Token 名称标记,NMTOKEN类型必须遵守元素名称的命名规则,但是其中一项限制除外。它们只能包含字母、数字、冒号、句点和连字符。
然而,与元素和属性名称不同的是,NMTOKEN的第一个字符可以是任意字符。
-NMTOKEN类型使得应用程序必须承担验证值有效性的任务。然而对于枚举类型,解析器能够提供有效性检查。
+NMTOKENS:值是有效XML名列表,用空格分隔
-跟IDREF和IDREFS的关系一样
+ENTITY:值是一个实体名
-对于多次出现的结构,可以为结构定义一个实体,然后通过引用实体来实现对结构的调用。
-DTD举例:
<!ATTLIST SalesResults month_graph ENTITY #IMPLIED>
DTD中声明实体:
<!ENTITY sales_chart SYSTEM "sales_chart.gif" NDATA gif>
XML中:
<SalesResults month_graph="sales_chart"> ... </SaleResultes>
+ENTITYS:值是实体列表,用空格分隔
-跟IDREF和IDREFS的关系一样
+NOTATION:值是一个NOTATION的名称
+http://www.quackit.com/xml/tutorial/dtd_attribute_types_notation.cfm
-声明NOTATION类型的属性格式如下:
<!ATTLIST element_name attribute_name NOTATION default_value>
-举例如下:
<!NOTATION GIF SYSTEM "image/gif">
<!NOTATION JPG SYSTEM "image/jpeg">
<!NOTATION PNG SYSTEM "image/png">
<!ATTLIST mountain
photo ENTITY #IMPLIED
photo_type NOTATION (GIF | JPG | PNG) #IMPLIED>
<!ENTITY mt_cook_1 SYSTEM "mt_cook1.jpg">
这段代码说明photo_type属性值只能是GIF,JPG,PNG三个中的一个。以下XML是合法的:‘
<mountains>
<mountain photo="mt_cook_1" photo_type="JPG">
<name>Mount Cook</name>
</mountain>
<mountain>
<name>Cradle Mountain</name>
</mountain>
</mountains>
+default-value可以是value,#REQUIRED,#IMPLIED,#FIXED value
+value:一个默认的value值
-举例:
DTD:
<!ELEMENT square EMPTY>
<!ATTLIST square width CDATA "0">
XML中:
<square width="100" />
在上面的例子中,square元素被定义成一个空元素并带有width属性,属性类型为CDATA,如果width的值没有指定,其默认的值为0。
+#REQUIRED:必须有此属性值
-语法:
<!ATTLIST element-name attribute-name attribute-type #REQUIRED>
-举例:
DTD:
<!ATTLIST person number CDATA #REQUIRED>
Valid XML:
<person number="5677" />
Invalid XML:
<person />
-如果你没有默认值但又要求此属性不许指定值,用#REQUIRED
+#IMPLIED:此属性值不是必须的
-语法:
<!ATTLIST element-name attribute-name attribute-type #IMPLIED>
-举例:
DTD:
<!ATTLIST contact fax CDATA #IMPLIED>
Valid XML:
<contact fax="555-667788" />
Valid XML:
<contact />
-如果这个属性不是必须的,且没有默认值可以指定,用#IMPLIED
+#FIXED value:一个固定的value值
-语法:
<!ATTLIST element-name attribute-name attribute-type #FIXED "value">
-举例:
DTD:
<!ATTLIST sender company CDATA #FIXED "Microsoft">
Valid XML:
<sender company="Microsoft" />
Invalid XML:
<sender company="W3Schools" />
-如果你想为指定一个固定的值并且不允许XML作者修改它,用@FIXED value
+还有一种是枚举值
-格式如下:
<!ATTLIST element-name attribute-name (en1|en2|..) default-value>
-举例:
DTD:
<!ATTLIST payment type (check|cash) "cash">
XML example:
<payment type="check" />
or
<payment type="cash" />
+什么时候用element什么时候用attribute
-XML没有规定什么时候改用element什么时候改用attribute
+数据即可没存储在element里也可被存储在attribute里
-举例:
sex存贮在attribute里
<person sex="female">
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>
sex存储在element里
<person>
<sex>female</sex>
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>
+建议尽量将数据放到element里
+用attribute的弊端
-attribute不能存储多个值
-attribute不容易扩展
-attribute不能描述结构
-attribute不容易被程序处理
-attribute不容易被DTD校验
-用attribute:
<note date="12/11/2002">
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
用element
<note>
<date>12/11/2002</date>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
扩展element
<note>
<date>
<day>12</day>
<month>11</month>
<year>2002</year>
</date>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
+Entity
-Entity相当于一个变量,用于定义一个标准文本数据或特殊字符。
-Entity引用指向一个Entity对象
+Entity对象可以是一个内部实体(指向内部数据)也可以是一个外部实体(指向外部数据)
+内部实体
+定义内部实体的语法:
<!ENTITY entity-name "entity-value">
-举例:
DTD Example:
<!ENTITY writer "Donald Duck.">
<!ENTITY copyright "Copyright W3Schools.">
XML example:
<author>&writer;©right;</author>
-一个Entity实体引用由三个部分组成:与号(&),实体名,分号(;)
+外部实体
+定义外部实体的语法:
<!ENTITY entity-name SYSTEM "URI/URL">
-举例:
DTD Example:
<!ENTITY writer SYSTEM "http://www.w3schools.com/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.w3schools.com/entities.dtd">
XML example:
<author>&writer;©right;</author>
+还有一种Entity称为参数实体
-它也和实体引用一样,您可以直接在 XML 文档内定义参数实体,或将其放在单独的 DTD 中。
-它专门在DTD文件里使用,不被XML使用,它主要用来在DTD中定义变量。其作用跟实体是一样的。
-一个简单的参数实体:
<!ENTITY % common.attributes
'id ID #IMPLIED
account CDATA #REQUIRED'
>
-以上是一个较严格的文本替换。在这个例子中,定义了两个属性,约束集中全部或大多数元素都应该具有这两个属性。您随后可以在 DTD 中定义那些元素
-<!ELEMENT purchaseOrder (item+, manufacturer, purchaser, purchaseInfo)>
<!ATTLIST purchaseOrder %common.attributes;>
<!ELEMENT item (price, quantity)>
<!ATTLIST item %common.attributes;>
<!ELEMENT manufacturer (#PCDATA)>
<!ATTLIST manufacturer %common.attributes;>
<!ELEMENT purchaser (#PCDATA)>
<!ATTLIST purchaser %common.attributes;>
<!ELEMENT purchaseInfo (creditCard | check | cash)>
-每个元素都使用 common.attributes 参数实体,该参数实体会被转换成示例中的字符串(包括 id 和 account 属性)以用于每个属性列表。和实体引用一样,更改参数实体的值会更改对所有元素的定义。此外,这一技术应该能整理您的 XML 文档及其 DTD 的组织。
-由于当 DTD 有大量带共同数据的元素时通常都使用参数实体,所以最好把它们放在单独的 DTD 中 — 对于参数实体,如果您有足够的数据类型,那么您可能就有足够的数据类型使用独立的 DTD。
+NOTATION
http://infohost.nmt.edu/tcc/help/pubs/dtd/notation-sect.html
-NOTATION声明的作用是定义非XML文件及其处理器,比如一个声音文件或一个图像文件,这样你就可以再XML文档中引用这些文件。
+它的通用格式如下:
<!NOTATION nname PUBLIC std>
<!NOTATION nname SYSTEM url>
-nname是这个notation的名字
std是一个公共notation的名字
url是指向一个处理这个文件的处理路径。
-最常用的是用它来描述MIME类型,比如:image/gif,image/jpeg 等。
+使用方法
+1.定义NOTATION
-<!NOTATION jpeg PUBLIC "JPG 1.0">
+2.定义实体
- <!ENTITY bogie-pic SYSTEM
"http://stars.com/bogart.jpg" NDATA jpeg>
+3.声明元素属性的类型是这个实体
-<!ATTLIST star-bio pin-shot ENTITY #REQUIRED>
+4.在XML中的具体使用
- <star-bio pin-shot="bogie-pic">...</star-bio>
+NOTATION 2
http://webdesign.about.com/od/dtds/a/aa101700b.htm
-在XML中尼可以定义一些非XML的数据,这需要借助NOTATION,它描述了这些数据的格式并且帮助你的应用程序识别并处理它。
+格式如下:
+<!NOTATION name system "external_ID">
+name指明了文件的格式,external_id标示这个notation,通常是一个MIME类型。
-比如下面这个例子,它在XML里定义了一个GIF图像:
<!NOTATION GIF system "image/gif">
+你也可以使用PUBLIC标记来代替SYSTEM。你需要在NOTATION里包含PUBLIC ID和URI。
-比如:
<!NOTATION GIF public
"-//IETF/NOSGML Media Type image/gif//EN"
"http://www.isi.edu/in-notes/iana/assignments/media-types/image/gif">
+XML验证
-可以用IE浏览器验证XML是否符合DTD定义规范
+JavaScript验证:
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async="false";
xmlDoc.validateOnParse="true";
xmlDoc.load("note_dtd_error.xml");
document.write("<br />Error Code: ");
document.write(xmlDoc.parseError.errorCode);
document.write("<br />Error Reason: ");
document.write(xmlDoc.parseError.reason);
document.write("<br />Error Line: ");
document.write(xmlDoc.parseError.line);
-load()方法用于加载文件,laodXML()方法用于加载文本字符串。
+给解析器加上validateOnParse="false"可以关闭DTD验证
-举例:
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async="false";
xmlDoc.validateOnParse="false";
xmlDoc.load("note_dtd_error.xml");
document.write("<br />Error Code: ");
document.write(xmlDoc.parseError.errorCode);
document.write("<br />Error Reason: ");
document.write(xmlDoc.parseError.reason);
document.write("<br />Error Line: ");
document.write(xmlDoc.parseError.line);
原文:http://www.cnblogs.com/ronhu/archive/2010/04/20/1716153.html