加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

DTD - XML验证文件

发布时间:2020-12-16 05:22:46 所属栏目:百科 来源:网络整理
导读:转载出处:http://www.zhuoda.org/irini/43776.html 1. DTD简介 DTD(Document Type Definition)定义了XML文档的合法构造块,他用一系列合法的元素定义文档结构 DTD可以在XML文档的内部声明,也可以外部引用 为什么要用DTD呢? 使用DTD,我们每个XML文件都可

转载出处:http://www.zhuoda.org/irini/43776.html

1. DTD简介

DTD(Document Type Definition)定义了XML文档的合法构造块,他用一系列合法的元素定义文档结构
DTD可以在XML文档的内部声明,也可以外部引用

为什么要用DTD呢?
使用DTD,我们每个XML文件都可以有自己的格式描述
使用DTD,独立的组织间可以用公用的DTD交换数据
在你的应用中可以用DTD检验你从外界得到的数据是否有效

内部DOCTYPE 声明
语法: <!DOCTYPE root-element [element-declarations]>

看个例子:

<?xml version="1.0"?>
<!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>

!DOCTYPE note 定义了这是一个note类型的文档
!ELEMENT note 定义note 有4个子元素 to,body
!ELEMENT to 定义to 这个元素是 #PCDATA 类型的
其他类似

外部DOCTYPE 声明
语法: <!DOCTYPE root-element SYSTEM "filename">

例子:

<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

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

我们已经定义了DTD,也按照定义写了XML文档,那如何验证呢?下面就用javascript验证一下
先写个错误的XML,然后用javascript检验

note_dtd_error.xml:
<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>Tove</to>
<fromm>Jani</fromm>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

validate.html:
<html>
<body>
<h3>
This demonstrates a parser error:
</h3>

<script type="text/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)
</script>

</body>
</html>

运行validate.html 可以看到以下信息:

This demonstrates a parser error:

Error Code: -1072898028
Error Reason: 根据 DTD/Schema,元素内容无效。预期: from。
Error Line: 12

DTD的概貌和如何验证已经看过了,接下来看一下DTD的具体语法

2. DTD-XML 构造块

在DTD看来,XML文档都是由以下简单的改造块构成的:
Elements
Attributes
Entities
PCDATA
CDATA

Elements
Elements是主要的构造块,可以包含文本,其他元素,或者为空,如
<message>some message in between</message>

Attributes
Attributes为Elements提供额外信息,他总是在Elements的起始标签中,总是以 name/value对 出现

Entities
Entities是用语定义通用文本的变量,Entities在XML文档被解析时被展开,下面的是XML预定义的实体:

&lt; <
&gt; >
&amp; &
&quot; "
&apos; '


PCDATA
PCDATA是字符数据,是会被解析的文本,文本中的tags会被当作标记处理,entities会被展开

CDATA
CDATA也是字符数据,但他是不会被解析的文本,文本中的tags不会被当作标记处理,entities也不会被展开

3. Elements

(1)声明一个Element,语法:

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

(2)Empty elements,用关键字 EMPTY 来声明

<!ELEMENT element-name EMPTY>

example:
<!ELEMENT br EMPTY>

XML example:
<br />

(3)Elements 只包含字符数据时,用 #PCDATA 来声明

<!ELEMENT element-name (#PCDATA)>

example:
<!ELEMENT from (#PCDATA)>

(4)Elements with any contents,用 ANY 声明时,元素可包含任何可以被解析的数据

<!ELEMENT element-name ANY>
example:
<!ELEMENT note ANY>

(5)Elements with children (sequences)

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

example:
<!ELEMENT note (to,body)>

子元素出现的顺序必须和声明时的一致,子元素也可以有子元素

(6) 声明相同元素只出现一次

<!ELEMENT element-name (child-name)>

example:
<!ELEMENT note (message)>
说明 message 在 note 中只能出现一次

(7) 声明相同元素至少出现一次

<!ELEMENT element-name (child-name+)>

example:
<!ELEMENT note (message+)>
"+"说明 message 在 note 中至少出现一次

(7) 声明相同元素出现0次或多次

<!ELEMENT element-name (child-name*)>

example:
<!ELEMENT note (message*)>
"*"说明 message 在 note 中的出现是随意的

(8) 声明相同元素出现0次或一次

<!ELEMENT element-name (child-name?)>

example:
<!ELEMENT note (message?)>
"?"说明 message 在 note 中可不出现,或者出现一次

(9) 声明 either/or 内容

example:
<!ELEMENT note (to,header,(message|body))>
note 必须包含一个to,一个from,一个header,和message body其中之一

(10) 声明混合内容

example:
<!ELEMENT note (#PCDATA|to|from|header|message)*>
note 可以包含 可被解析的字符,to,message,并且可以出现任意次

4. Attributes

(1) 声明Attributes,语法:

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

example:
DTD example:
<!ATTLIST payment type CDATA "check">

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

attribute-type 有下列值:
CDATA 字符数据
(en1|en2|..) 值必须是枚举列表中的一个
ID unique id
IDREF 其他元素的id
IDREFS 其他id 列表
NMTOKEN 一个有效的XML名字
NMTOKENS 有效的XML名列表
ENTITY 一个实体
ENTITIES 一个实体列表
NOTATION 一个符号名
xml: 一个预定义的XML值

default-value 有下列值:
value 默认值
#REQUIRED 这个属性必须出现
#IMPLIED 这个属性不是必须的
#FIXED value 这个属性的只是固定的


(2) 指定一个默认值属性

DTD:
<!ELEMENT square EMPTY>
<!ATTLIST square width CDATA "0">

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

square被定义为一个空元素,他有一个CDATA类型的属性 width,如果width没被指定值,那他就是0

(3) #IMPLIED
语法:

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

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

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

(4) #REQUIRED
语法:

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

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

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

Invalid XML:
<person />

(5) #FIXED
语法:

<!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" />

(6) Enumerated attribute values

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

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

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

5. Entities
Entities 是用来为普通文本定义捷径
有两种声明方式:
(1) 内部声明

Syntax:
<!ENTITY entity-name "entity-value">

DTD Example:

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

XML example:

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

(2) 外部声明

Syntax:

<!ENTITY entity-name SYSTEM "URI/URL">

DTD Example:

<!ENTITY writer
SYSTEM "http://www.w3schools.com/dtd/entities.dtd">
!ENTITY copyright
SYSTEM "http://www.w3schools.com/dtd/entities.dtd"> XML example: <author>&writer;&copyright;</author>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读