`

DTD - XML Building Blocks

阅读更多
http://www.w3schools.com/DTD/default.asp

The main building blocks of both XML and HTML documents are elements.


--------------------------------------------------------------------------------

The Building Blocks of XML Documents
Seen from a DTD point of view, all XML documents (and HTML documents) are made up by the following building blocks:

Elements
Attributes
Entities
PCDATA
CDATA

--------------------------------------------------------------------------------

Elements
Elements are the main building blocks of both XML and HTML documents.

Examples of HTML elements are "body" and "table". Examples of XML elements could be "note" and "message". Elements can contain text, other elements, or be empty. Examples of empty HTML elements are "hr", "br" and "img".

Examples:

<body>some text</body>

<message>some text</message>


--------------------------------------------------------------------------------

Attributes
Attributes provide extra information about elements.

Attributes are always placed inside the opening tag of an element. Attributes always come in name/value pairs. The following "img" element has additional information about a source file:

<img src="computer.gif" />

The name of the element is "img". The name of the attribute is "src". The value of the attribute is "computer.gif". Since the element itself is empty it is closed by a " /".


--------------------------------------------------------------------------------

Entities
Some characters have a special meaning in XML, like the less than sign (<) that defines the start of an XML tag.

Most of you know the HTML entity: "&nbsp;". This "no-breaking-space" entity is used in HTML to insert an extra space in a document. Entities are expanded when a document is parsed by an XML parser.

The following entities are predefined in XML:

Entity References Character
&lt; <
&gt; >
&amp; &
&quot; "
&apos; '
 
--------------------------------------------------------------------------------

PCDATA
PCDATA means parsed character data.

Think of character data as the text found between the start tag and the end tag of an XML element.

PCDATA is text that WILL be parsed by a parser. The text will be examined by the parser for entities and markup.

Tags inside the text will be treated as markup and entities will be expanded.

However, parsed character data should not contain any &, <, or > characters; these need to be represented by the &amp; &lt; and &gt; entities, respectively.


--------------------------------------------------------------------------------

CDATA
CDATA means character data.

CDATA is text that will NOT be parsed by a parser. Tags inside the text will NOT be treated as markup and entities will not be expanded.

In a DTD, elements are declared with an ELEMENT declaration.


--------------------------------------------------------------------------------

Declaring Elements
In a DTD, XML elements are declared with an element declaration with the following syntax:

<!ELEMENT element-name category>
or
<!ELEMENT element-name (element-content)>


--------------------------------------------------------------------------------

Empty Elements
Empty elements are declared with the category keyword EMPTY:

<!ELEMENT element-name EMPTY>

Example:

<!ELEMENT br EMPTY>

XML example:

<br />


--------------------------------------------------------------------------------

Elements with Parsed Character Data
Elements with only parsed character data are declared with #PCDATA inside parentheses:

<!ELEMENT element-name (#PCDATA)>

Example:

<!ELEMENT from (#PCDATA)>


--------------------------------------------------------------------------------

Elements with any Contents
Elements declared with the category keyword ANY, can contain any combination of parsable data:

<!ELEMENT element-name ANY>

Example:

<!ELEMENT note ANY>


--------------------------------------------------------------------------------

Elements with Children (sequences)
Elements with one or more children are declared with the name of the children elements inside parentheses:

<!ELEMENT element-name (child1)>
or
<!ELEMENT element-name (child1,child2,...)>

Example:

<!ELEMENT note (to,from,heading,body)>

When children are declared in a sequence separated by commas, the children must appear in the same sequence in the document. In a full declaration, the children must also be declared, and the children can also have children. The full declaration of the "note" element is:

<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>


--------------------------------------------------------------------------------

Declaring Only One Occurrence of an Element
<!ELEMENT element-name (child-name)>

Example:

<!ELEMENT note (message)>

The example above declares that the child element "message" must occur once, and only once inside the "note" element.


--------------------------------------------------------------------------------

Declaring Minimum One Occurrence of an Element
<!ELEMENT element-name (child-name+)>

Example:

<!ELEMENT note (message+)>

The + sign in the example above declares that the child element "message" must occur one or more times inside the "note" element.


--------------------------------------------------------------------------------

Declaring Zero or More Occurrences of an Element
<!ELEMENT element-name (child-name*)>

Example:

<!ELEMENT note (message*)>

The * sign in the example above declares that the child element "message" can occur zero or more times inside the "note" element.


--------------------------------------------------------------------------------

Declaring Zero or One Occurrences of an Element
<!ELEMENT element-name (child-name?)>

Example:

<!ELEMENT note (message?)>

The ? sign in the example above declares that the child element "message" can occur zero or one time inside the "note" element.


--------------------------------------------------------------------------------

Declaring either/or Content
Example:

<!ELEMENT note (to,from,header,(message|body))>

The example above declares that the "note" element must contain a "to" element, a "from" element, a "header" element, and either a "message" or a "body" element.


--------------------------------------------------------------------------------

Declaring Mixed Content
Example:

<!ELEMENT note (#PCDATA|to|from|header|message)*>

The example above declares that the "note" element can contain zero or more occurrences of parsed character data, "to", "from", "header", or "message" elements.

In a DTD, attributes are declared with an ATTLIST declaration.


--------------------------------------------------------------------------------

Declaring Attributes
An attribute declaration has the following syntax:

<!ATTLIST element-name attribute-name attribute-type default-value>

DTD example:

<!ATTLIST payment type CDATA "check">

XML example:

<payment type="check" /> 

The attribute-type can be one of the following:

Type Description
CDATA The value is character data
(en1|en2|..) The value must be one from an enumerated list
ID The value is a unique id 
IDREF The value is the id of another element
IDREFS The value is a list of other ids
NMTOKEN The value is a valid XML name
NMTOKENS The value is a list of valid XML names
ENTITY The value is an entity 
ENTITIES The value is a list of entities
NOTATION The value is a name of a notation
xml: The value is a predefined xml value

The default-value can be one of the following:

Value Explanation
value The default value of the attribute
#REQUIRED The attribute is required
#IMPLIED The attribute is not required
#FIXED value The attribute value is fixed


--------------------------------------------------------------------------------

A Default Attribute Value
DTD:
<!ELEMENT square EMPTY>
<!ATTLIST square width CDATA "0">

Valid XML:
<square width="100" />

In the example above, the "square" element is defined to be an empty element with a "width" attribute of  type CDATA. If no width is specified, it has a default value of 0.


--------------------------------------------------------------------------------

#REQUIRED
Syntax
<!ATTLIST element-name attribute-name attribute-type #REQUIRED>

Example
DTD:
<!ATTLIST person number CDATA #REQUIRED>

Valid XML:
<person number="5677" />

Invalid XML:
<person />

Use the #REQUIRED keyword if you don't have an option for a default value, but still want to force the attribute to be present.


--------------------------------------------------------------------------------

#IMPLIED
Syntax
<!ATTLIST element-name attribute-name attribute-type #IMPLIED>

Example
DTD:
<!ATTLIST contact fax CDATA #IMPLIED>

Valid XML:
<contact fax="555-667788" />

Valid XML:
<contact />

Use the #IMPLIED keyword if you don't want to force the author to include an attribute, and you don't have an option for a default value.


--------------------------------------------------------------------------------

#FIXED
Syntax
<!ATTLIST element-name attribute-name attribute-type #FIXED "value">

Example
DTD:
<!ATTLIST sender company CDATA #FIXED "Microsoft">

Valid XML:
<sender company="Microsoft" />

Invalid XML:
<sender company="W3Schools" />

Use the #FIXED keyword when you want an attribute to have a fixed value without allowing the author to change it. If an author includes another value, the XML parser will return an error.


--------------------------------------------------------------------------------

Enumerated Attribute Values
Syntax
<!ATTLIST element-name attribute-name (en1|en2|..) default-value>

Example
DTD:
<!ATTLIST payment type (check|cash) "cash">

XML example:
<payment type="check" />
or
<payment type="cash" />

Use enumerated attribute values when you want the attribute value to be one of a fixed set of legal values.

Use of Elements vs. Attributes
Data can be stored in child elements or in attributes.

Take a look at these examples:

<person sex="female">
  <firstname>Anna</firstname>
  <lastname>Smith</lastname>
</person>

<person>
  <sex>female</sex>
  <firstname>Anna</firstname>
  <lastname>Smith</lastname>
</person>

In the first example sex is an attribute. In the last, sex is a child element. Both examples provide the same information.

There are no rules about when to use attributes, and when to use child elements. My experience is that attributes are handy in HTML, but in XML you should try to avoid them. Use child elements if the information feels like data.


--------------------------------------------------------------------------------

My Favorite Way
I like to store data in child elements.

The following three XML documents contain exactly the same information:

A date attribute is used in the first example:

<note date="12/11/2002">
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note> 

A date element is used in the second example:

<note>
  <date>12/11/2002</date>
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note> 

An expanded date element is used in the third: (THIS IS MY FAVORITE):

<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> 


--------------------------------------------------------------------------------

Avoid using attributes?
Should you avoid using attributes?

Some of the problems with attributes are:

attributes cannot contain multiple values (child elements can)
attributes are not easily expandable (for future changes)
attributes cannot describe structures (child elements can)
attributes are more difficult to manipulate by program code
attribute values are not easy to test against a DTD
If you use attributes as containers for data, you end up with documents that are difficult to read and maintain. Try to use elements to describe data. Use attributes only to provide information that is not relevant to the data.

Don't end up like this (this is not how XML should be used):

<note day="12" month="11" year="2002"
to="Tove" from="Jani" heading="Reminder"
body="Don't forget me this weekend!">
</note> 


--------------------------------------------------------------------------------

An Exception to my Attribute Rule
Rules always have exceptions.

My rule about attributes has one exception:

Sometimes I assign ID references to elements. These ID references can be used to access XML elements in much the same way as the NAME or ID attributes in HTML. This example demonstrates this:

<messages>
<note id="p501">
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>

<note id="p502">
  <to>Jani</to>
  <from>Tove</from>
  <heading>Re: Reminder</heading>
  <body>I will not!</body>
</note>
</messages> 

The ID in these examples is just a counter, or a unique identifier, to identify the different notes in the XML file, and not a part of the note data.

What I am trying to say here is that metadata (data about data) should be stored as attributes, and that data itself should be stored as elements.

Entities are variables used to define shortcuts to standard text or special characters.

Entity references are references to entities

Entities can be declared internal or external


--------------------------------------------------------------------------------

An Internal Entity Declaration
Syntax
<!ENTITY entity-name "entity-value">

Example
DTD Example:

<!ENTITY writer "Donald Duck.">
<!ENTITY copyright "Copyright W3Schools.">

XML example:

<author>&writer;&copyright;</author>

Note: An entity has three parts: an ampersand (&), an entity name, and a semicolon (;).


--------------------------------------------------------------------------------

An External Entity Declaration
Syntax
<!ENTITY entity-name SYSTEM "URI/URL">

Example
DTD Example:

<!ENTITY writer SYSTEM "http://www.w3schools.com/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.w3schools.com/entities.dtd">

XML example:

<author>&writer;&copyright;</author>

With Internet Explorer 5+ you can validate your XML against a DTD.


--------------------------------------------------------------------------------

Validating With the XML Parser
If you try to open an XML document, the XML Parser might generate an error. By accessing the parseError object, you can retrieve the error code, the error text, or even the line that caused the error.

Note: The load( ) method is used for files, while the loadXML( ) method is used for strings.

Example
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);

 

Look at the XML file


--------------------------------------------------------------------------------

Turn Validation Off
Validation can be turned off by setting the XML parser's validateOnParse="false".

Example
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);

 


--------------------------------------------------------------------------------

A General XML Validator
To help you check your xml files, you can syntax-check any XML file here.


--------------------------------------------------------------------------------

The parseError Object
You can read more about the parseError object in our XML DOM tutorial.

TV Schedule DTD
By David Moisan. Copied from http://www.davidmoisan.org/

<!DOCTYPE TVSCHEDULE [

<!ELEMENT TVSCHEDULE (CHANNEL+)>
<!ELEMENT CHANNEL (BANNER,DAY+)>
<!ELEMENT BANNER (#PCDATA)>
<!ELEMENT DAY (DATE,(HOLIDAY|PROGRAMSLOT+)+)>
<!ELEMENT HOLIDAY (#PCDATA)>
<!ELEMENT DATE (#PCDATA)>
<!ELEMENT PROGRAMSLOT (TIME,TITLE,DESCRIPTION?)>
<!ELEMENT TIME (#PCDATA)>
<!ELEMENT TITLE (#PCDATA)>
<!ELEMENT DESCRIPTION (#PCDATA)>

<!ATTLIST TVSCHEDULE NAME CDATA #REQUIRED>
<!ATTLIST CHANNEL CHAN CDATA #REQUIRED>
<!ATTLIST PROGRAMSLOT VTR CDATA #IMPLIED>
<!ATTLIST TITLE RATING CDATA #IMPLIED>
<!ATTLIST TITLE LANGUAGE CDATA #IMPLIED>
]>


--------------------------------------------------------------------------------

Newspaper Article DTD
Copied from http://www.vervet.com/

<!DOCTYPE NEWSPAPER [

<!ELEMENT NEWSPAPER (ARTICLE+)>
<!ELEMENT ARTICLE (HEADLINE,BYLINE,LEAD,BODY,NOTES)>
<!ELEMENT HEADLINE (#PCDATA)>
<!ELEMENT BYLINE (#PCDATA)>
<!ELEMENT LEAD (#PCDATA)>
<!ELEMENT BODY (#PCDATA)>
<!ELEMENT NOTES (#PCDATA)>

<!ATTLIST ARTICLE AUTHOR CDATA #REQUIRED>
<!ATTLIST ARTICLE EDITOR CDATA #IMPLIED>
<!ATTLIST ARTICLE DATE CDATA #IMPLIED>
<!ATTLIST ARTICLE EDITION CDATA #IMPLIED>

<!ENTITY NEWSPAPER "Vervet Logic Times">
<!ENTITY PUBLISHER "Vervet Logic Press">
<!ENTITY COPYRIGHT "Copyright 1998 Vervet Logic Press">

]>


--------------------------------------------------------------------------------

Product Catalog DTD
Copied from http://www.vervet.com/

<!DOCTYPE CATALOG [

<!ENTITY AUTHOR "John Doe">
<!ENTITY COMPANY "JD Power Tools, Inc.">
<!ENTITY EMAIL "jd@jd-tools.com">

<!ELEMENT CATALOG (PRODUCT+)>

<!ELEMENT PRODUCT
(SPECIFICATIONS+,OPTIONS?,PRICE+,NOTES?)>
<!ATTLIST PRODUCT
NAME CDATA #IMPLIED
CATEGORY (HandTool|Table|Shop-Professional) "HandTool"
PARTNUM CDATA #IMPLIED
PLANT (Pittsburgh|Milwaukee|Chicago) "Chicago"
INVENTORY (InStock|Backordered|Discontinued) "InStock">

<!ELEMENT SPECIFICATIONS (#PCDATA)>
<!ATTLIST SPECIFICATIONS
WEIGHT CDATA #IMPLIED
POWER CDATA #IMPLIED>

<!ELEMENT OPTIONS (#PCDATA)>
<!ATTLIST OPTIONS
FINISH (Metal|Polished|Matte) "Matte"
ADAPTER (Included|Optional|NotApplicable) "Included"
CASE (HardShell|Soft|NotApplicable) "HardShell">

<!ELEMENT PRICE (#PCDATA)>
<!ATTLIST PRICE
MSRP CDATA #IMPLIED
WHOLESALE CDATA #IMPLIED
STREET CDATA #IMPLIED
SHIPPING CDATA #IMPLIED>

<!ELEMENT NOTES (#PCDATA)>

]>

DTD Summary
This tutorial has taught you how to describe the structure of an XML document.

You have learned how to use a DTD to define the legal elements of an XML document, and how a DTD can be declared inside your XML document, or as an external reference.

You have learned how to declare the legal elements, attributes, entities, and CDATA sections for XML documents.

You have also seen how to validate an XML document against a DTD.


--------------------------------------------------------------------------------

Now You Know DTD, What's Next?
The next step is to learn about XML Schema.

XML Schema is used to define the legal elements of an XML document, just like a DTD. We think that very soon XML Schemas will be used in most Web applications as a replacement for DTDs.

XML Schema is an XML-based alternative to DTD.

Unlike DTD, XML Schemas has support for data types and namespaces.

If you want to learn more about XML Schema, please visit our XML Schema tutorial.
分享到:
评论

相关推荐

    使用DTD验证XML文档

    使用DTD验证XML文档 一、 DTD的定义: a) DTD是Document Type Defintion的缩写,即文档类型定义。DTD用来描述XML文档的结构。 二、 DTD可能包含的内容: a) 元素的定义规则。 b) 元素之间的关系规则。 c) 属性的定义...

    VTD-XML技术解析XML实例

    - **XML验证**:通过VTD-XML,可以快速验证XML文档是否符合特定的DTD(Document Type Definition)或XSD(XML Schema Definition)。 - **XML转换**:将XML转换为其他格式,如JSON,或者进行XML到XML的映射。 - **...

    xml与DTD,xml与DTD

    ### XML与DTD详解 #### 一、XML简介 XML(Extensible Markup Language)是一种非常重要的数据交换标准,它被广泛应用于互联网数据交换场景之中。XML的设计初衷是为了传输和存储数据,其灵活性允许用户自定义标签,...

    《XML》实验(1) -- XML Basics & DTD

    [实验目的] 1、安装并学习如何使用XMLSPY集成开发环境完成XML相关的开发工作。 2、熟悉和掌握XML规范的基本内容,包括XML声明、...使用内部/外部DTD规则,对XML数据文档的有效性进行约束。 某软件学院XML课程实验答案

    VDT-XML解析xml文件,修改、查找xml文件。

    - 文档类型定义(DTD)或XML Schema:用于定义XML文档的结构和数据类型。 2. **VDT-XML解析XML** - VDT-XML提供了一种高效的方式,快速解析XML文档,将XML数据转换为易于操作的对象模型。 - 解析过程:VDT-XML...

    W5-Design-XML-using-DTD-and-XML-Schema:使用 DTD 和 XML Schema 设计 XML

    使用 DTD 和 XML 模式的 XML 设计项目描述:基于此ER图,执行以下操作: Create a DTD that captures all this information. Avoid data redundancies (do not duplicate data, exceptkeyrefs/idrefs). You may use ...

    实验二-基于DTD实现XML文档的有效性验证.doc

    本文档总结了基于DTD实现XML文档的有效性验证的实验报告。实验目的是通过定义和引用DTD来实现XML文档的有效性验证,并掌握DTD中各要素的定义。 知识点: 1. DTD(Document Type Definition)的定义:DTD是用于定义...

    docbook-xml-4.5.zip

    3. **soextblx.dtd**、**calstblx.dtd**、**docbookx.dtd**:这些都是DTD文件,定义了DocBook XML的语法规则和结构。例如,`docbookx.dtd`是主DTD,包含了所有基本的DocBook元素和属性。而`soextblx.dtd`和`calstblx...

    mybatis-3-config.dtd mybatis-3-mapper.dtd

    在实际应用中,`mybatis-3-config.dtd` 和 `mybatis-3-mapper.dtd` 通过引入机制被引用到XML配置文件中,确保解析器能够理解并验证配置文件的语法。例如: ```xml &lt;!DOCTYPE configuration PUBLIC "-//mybatis.org...

    DTD规范XML文档编写

    DTD规范XML文档编写级XML文档的一般书写格式

    mybatis-3-config/mapper.dtd 解决mybatis头文件报错

    然后打开eclipse -&gt;Window-&gt;prefenrence-&gt;XML-&gt;XML Catalog-&gt;User Specifiled Entreis-&gt;Add-&gt;Location(此处是你放dtd文件的位置例如:‪D:\mybatis\mybatis-3-config.dtd)-&gt;Key(如果更改config,此处应该是:-//...

    XML实验(1) - XML Basics & DTD

    《XML》实验任务书 (1) XML Basics & DTD [实验目的] 1、安装并学习如何使用XMLSPY集成开发环境完成XML相关的开发工作。 2、熟悉和掌握XML规范的基本内容,包括XML声明、注释、处理指令、元素、属性、CDATA段、...

    xml课程设计---xml留言板

    - DTD(Document Type Definition)或XSD(XML Schema Definition):用于定义XML文档的结构和约束。 2. JSP(JavaServer Pages): - JSP基础:JSP是Java的一种动态网页技术,可以将HTML、CSS、JavaScript与Java...

    aduna-commons-xml-2.2.jar.zip

    XML验证是另一个关键特性,aduna-commons-xml库支持XML Schema(XSD)和DTD(Document Type Definition)来验证XML文档是否符合预定义的结构规则。这对于确保数据的准确性和一致性至关重要,特别是在数据交换和跨...

    perl-XML-LibXML-Common-0.13-8.i586.rar_perl xml

    - **XML数据的验证**:根据XML Schema或DTD(Document Type Definition)验证XML文档的结构合法性。 在压缩包文件中,`perl-XML-LibXML-Common-0.13-8.i586.rpm` 是该模块的安装包,适用于i586架构的Linux系统。...

    Xerces-xml-schema

    相比于早期的 DTD(Document Type Definition),XML Schema 提供了更丰富的数据类型、命名空间支持以及更严格的验证机制,使得 XML 文档的结构更加严谨,更利于数据交换和处理。XML Schema 使用 XML 语法编写,这...

    XML轻松学习手册--XML语法之一

    其中`type-of-doc`是自定义的文档类型,`SYSTEM`或`PUBLIC`用于指定DTD来源,`dtd-name`是DTD文件的URL或名称。 XML文档中的大小写是敏感的,例如`&lt;P&gt;`和`&lt;p&gt;`是两个不同的元素。为了避免错误,建议统一元素的大小...

Global site tag (gtag.js) - Google Analytics