旗下导航:搜·么
当前位置:网站首页 > XML教程 > 正文

XML—XML文件束缚之DTD详解【XML教程】,XML,文件约束,DTD详解

作者:搜教程发布时间:2019-11-27分类:XML教程浏览:36评论:0


导读:1.XML文件束缚与DTD的简朴引见我们编写文档来束缚一个XML文档的誊写范例,这称之为XML束缚。经常运用的束缚手艺有:XMLDTDX...

1.XML文件束缚与DTD的简朴引见

我们编写文档来束缚一个XML文档的誊写范例,这称之为XML束缚。

经常运用的束缚手艺有:

  • XML DTD

  • XML Schema

DTD的基础概念:

document type definition 文档范例定义

DTD文件平常和XML文件合营运用,重要是为了束缚XML文件。

XML文件引入DTD文件,如许XML可以自定义标签,但又遭到DTD文件的束缚。比方上一节运用XML形貌一个班级的信息,假如我们给每个门生定义一个<面积>标签,语法上也是没有毛病的,然则不符合语义,门生怎么可以用面积来形貌呢?这时刻我们就需要用到DTD文件来束缚这个XML。

<?xml version="1.0" encoding="gb2312"?><class>
    <stu id="001">
        <name>杨过</name> 
        <sex>男</sex>
        <age>20</age>
        <面积>100</面积>
    </stu></class>

1.1 DTD束缚疾速入门案例

基础语法:

<!ELEMENT 元素名 范例>

我们还以班级为例,编写以下DTD文件,myClass.dtd:

<!ELEMENT 班级 (门生+)><!ELEMENT 门生 (名字,岁数,引见)><!ELEMENT 名字 (#PCDATA)><!ELEMENT 岁数 (#PCDATA)><!ELEMENT 引见 (#PCDATA)>

第一行示意根元素为班级,而且有门生这个子元素,子元素为1或许多个。
第二行示意门生的子元素为名字,岁数,引见
名字下面没有子元素了,那末#PCDATA示意名字内里可以听任意文本。
岁数和引见也是相似。

编写myClass.xml文件并引入DTD文件以下:

<?xml version="1.0" encoding="utf-8"?><!--引入dtd文件,束缚这个xml--><!DOCTYPE 班级 SYSTEM "myClass.dtd"><班级>
    <门生>
        <名字>周小星</名字>    
        <岁数>23</岁数>
        <引见>进修受苦</引见>
    </门生>   
    <门生>
        <名字>林晓</名字> 
        <岁数>25</岁数>
        <引见>是一个好门生</引见>
    </门生>   </班级>

引入中写的:SYSTEM,示意当前的DTD文件是当地的
假如写的是PUBLIC,则示意引入的DTD文件是来自于收集的.

这时刻引入的DTD文件是没有发生作用的,假如我们在门生元素中增加子元素<面积>,翻开这个XML文件,浏览器依旧不会报错。

<?xml version="1.0" encoding="utf-8"?><!--引入dtd文件,束缚这个xml--><!DOCTYPE 班级 SYSTEM "myClass.dtd"><班级>
    <门生>
        <名字>周小星</名字>    
        <岁数>23</岁数>
        <引见>进修受苦</引见>
        <面积>100平米</面积>
    </门生>   
    <门生>
        <名字>林晓</名字> 
        <岁数>25</岁数>
        <引见>是一个好门生</引见>
    </门生>   </班级>

我们需要编程校验XML文档的正确性

IE5以上的浏览器内置了XML剖析东西:Microsoft.XMLDOM,开发人员可以编写JavaScript代码,运用这个剖析东西装载XML文件,并对XML文件举行DTD考证。

我们编写myXmlTools.html来对这个XML举行校验,以下:

<html>
    <head>
    <!--本身编写一个简朴的剖析东西,去剖析XML DTD是不是配套-->     
    <script language="javascript">
        // 建立xml文档剖析器对象
        var xmldoc = new ActiveXObject("Microsoft.XMLDOM");        // 开启xml校验
        xmldoc.validateOnParse = "true";        // 装载xml文档,即指定校验哪一个XML文件
        xmldoc.load("myClass.xml");
        document.writeln("毛病信息:"+xmldoc.parseError.reason+"<br>");
        document.writeln("毛病行号:"+xmldoc.parseError.line);    </script>

    </head>
    <body>

    </body></html>

用IE浏览器翻开这个html文件,可以看到运转效果:

可以看到第9行恰是我们增加的<面积>这一行。

2.DTD细节

2.1 DTD文档的声明及援用

1.内部DTD文档

<!DOCTYPE 根元素 [定义内容]>

2.外部DTD文档

引入外部的DTD文档分为两种:

(1)当援用的DTD文件是当地文件的时刻,用SYSTEM标识,并写上”DTD的文件途径”,以下:

<!DOCTYPE 根元素 SYSTEM "DTD文件途径">

(2)假如援用的DTD文件是一个大众的文件时,采纳PUBLIC标识,以下体式格局:

<!DOCTYPE 根元素 PUBLIC "DTD称号" "DTD文件的URL">

比以下例:

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems,Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

2.2 DTD基础语法:

<!ELEMENT NAME CONTENT>

个中:
- ELEMENT是关键字,是不能修正的
- NAME示意元素称号
- CONTENT是元素范例,必需要大写!CONTENT的内容有三种写法:

(1)EMPTY——示意该元素不能包含子元素和文本,但可以有属性。
(2)ANY——示意该元素可以包含任安在该DTD中定义的元素内容
(3)#PCDATA——可以包含任何字符数据,然则不能在个中包含任何子元素

2.3 DTD元素的组合范例:

DTD中如许划定:

<!ELEMENT 家庭(人+,家电*)>

这个DTD划定了家庭元素中可以有1到多个”人”这个子元素,也可以有0到多个”家电”这个子元素。个中的加号”+”和星号”*”的寄义与正则表达式中的寄义一致。

XML如许写:

<家庭>
    <人 名字="张晓明" 性别="男" 岁数="25"/>
    <人 名字="李小钢" 性别="男" 岁数="36" 兴趣="作个教诲家和巨人"/>
    <家电 称号="彩电" 数目="3"/></家庭>

关于组合范例,有下述的的修饰符可以运用:

标记 用处 示例 示例申明
() 用来给元素分组 (古龙|金庸),(王朔|余杰) 分红两组
| 在列出的对象中挑选一个 (男子|女人) 示意男子或许女人必需涌现,二者至少选其一
+ 该对象必需涌现一次或许屡次 (成员+) 示意成员必需涌现,而却可以涌现多个成员
* 该对象许可涌现0次或许屡次 (兴趣*) 兴趣可以涌现两次到屡次
? 该对象必需涌现0次或许1次 (菜鸟?) 菜鸟可以涌现,也可以不涌现,假如涌现的话,最多只能涌现一次
, 对象必需按指定的递次涌现 (西瓜,苹果,香蕉) 示意西瓜、苹果、香蕉必需涌现,而且按这个递次涌现

2.4 属性定义

DTD中属性的定义是如许的:

<!ATTLIST 元素称号
    属性称号 范例 属性特性
    属性称号 范例 属性特性......  >

个中,属性的范例有下面5种:

(1) CDATA
(2) ID
(3) IDREF/IDREFS
(4) Enumerated
(5) ENTITY/ENTITIES

属性的特性有以下4种:

(1) #REQUIRED,示意这个属性必需给,不给就报错
(2) #IMPLIED,示意这个属性可以给也可以不给
(3) #FIXED value,示意这个属性必需给一个牢固的value值
(4) Default value,示意这个属性假如没有值,就分派一个默许的value值

比方,我们想在门生这个子元素上加上地点这个属性,而且这个属性是必需的,示例以下:

<?xml version="1.0" encoding="utf-8"?><!DOCTYPE 班级 SYSTEM "myClass.dtd"><班级>
    <门生 地点="香港">
        <名字>周小星</名字>    
        <岁数>23</岁数>
        <引见>进修受苦</引见>
    </门生>   
    <门生 地点="澳门">
        <名字>林晓</名字> 
        <岁数>25</岁数>
        <引见>是一个好门生</引见>
    </门生>   </班级>

这个时刻响应的DTD文件也要更新,不然就会报错,以下:

<!ELEMENT 班级 (门生+)><!ELEMENT 门生 (名字,岁数,引见)><!ATTLIST 门生
    地点 CDATA #REQUIRED><!ELEMENT 名字 (#PCDATA)><!ELEMENT 岁数 (#PCDATA)><!ELEMENT 引见 (#PCDATA)>

2.4.1 关于属性范例的细致诠释

(1)属性范例-CDATA,示意属性值可以是任何字符(包含中文和数字)

<!ATTLIST 木偶
    姓名 CDATA #REQUIRED>
<木偶 姓名="匹诺曹"/><木偶 姓名="PiNuocao"/><木偶 姓名="123"/>

(2)属性范例-ID,表明该属性的取值必需是唯一的,然则属性的值不能是以数字开首!

<!ELEMENT 公司人员 ANY><!ATTLIST 公司人员
    编号 ID #REQUIRED
    姓名 CDATA #REQUIRED>
<公司人员 编号="Z001" 姓名="张三"/><公司人员 编号="Z002" 姓名="李思"/>

(3)属性范例-IDREF/IDREFS
- IDREF属性的值指向文档中别的处所声明的ID范例的值
- IDREFS同IDREF,然则可以具有由空格离开的多个援用。

<!ELEMENT 家庭(人+)><!ELEMENT 人 EMPTY><!ATTLIST 人    relID ID #REQUIRED
    paraentID IDREFS #IMPLIED
    name CDATA #REQUIRED>
<家庭>
    <人 relID="P_1" name="爸爸"/>
    <人 relID="P_2" name="妈妈"/>
    <人 relID="P_3" parentID="P_1 P_2" name="儿子"/></家庭>

(4)属性范例-Enumerated,事前定义好一些值,属性的值必需在所列出的值的范围内。

<!ATTLIST person
    婚姻状况 (single|married|porced|widowed) #IMPLIED><!ATTLIST person
    性别 (男|女) #REQUIRED>

(5)属性范例-ENTITY,实体

实体定义:
- 实体用于为一段内容建立一个别号,今后在XML文档中就可以运用别号援用这段内容了。
- 在DTD定义中,一条!ENTITY语句用于定义一个实体。
- 实体可分为两种范例:援用实体和参数实体。援用实体是被XML文档运用的,而参数实体是被DTD文件本身运用的。

①援用实体:

  • 援用实体重要在XML文档中被运用
    语法花样以下,援用实体的定义内容最好放在DTD文件的末了。

<!ENTITY 实体称号 "实体内容">

援用体式格局:&实体称号; 末端要带上分号,这个援用将直接转变成实体内容

举例以下:

<!ENTITY copyright "I am a programmer">....
&copyright;

②参数实体:

参数实体被DTD文件本身运用
语法花样为:

<!ENTITY % 实体称号 "实体内容">

援用体式格局为:%实体称号

举例:

<!ENTITY % TAG_NAME "姓名|EMAIL|电话|地点"><!ELEMENT 个人信息 (%TAG_NAME;|生日)><!ELEMENT 客户信息 (%TAG_NAME;|公司名)>

3.DTD现实案例

进修DTD的目的在于:
(1)请求我们可以看得懂DTD文件,
(2)我们可以依据给出的DTD写出对应的XML文件

下面我们看一个案例,下述的DTD文件是从W3School在线教程中的DTD案例中拿过来的,细看每一行,我们都应该可以看得懂。

<!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 PRODUCTNAME CDATA #IMPLIEDCATEGORY (HandTool|Table|Shop-Professional) 
"HandTool"PARTNUM CDATA #IMPLIEDPLANT (Pittsburgh|Milwaukee|Chicago) "Chicago"INVENTORY (InStock|Backordered|Discontinued) "InStock">
<!ELEMENT SPECIFICATIONS (#PCDATA)><!ATTLIST SPECIFICATIONSWEIGHT CDATA #IMPLIEDPOWER CDATA #IMPLIED><!ELEMENT OPTIONS (#PCDATA)>
<!ATTLIST OPTIONSFINISH (Metal|Polished|Matte) "Matte" 
ADAPTER (Included|Optional|NotApplicable) "Included"CASE (HardShell|Soft|NotApplicable) "HardShell"><!ELEMENT PRICE (#PCDATA)>
<!ATTLIST PRICEMSRP CDATA #IMPLIEDWHOLESALE CDATA #IMPLIEDSTREET CDATA #IMPLIEDSHIPPING CDATA #IMPLIED><!ELEMENT NOTES (#PCDATA)>

然后我们可以依据该DTD编写以下最简朴的XML文件:

<?xml version="1.0" encoding="utf-8"?><!DOCTYPE CATALOG SYSTEM "product.dtd"><CATALOG>
    <PRODUCT NAME="康帅傅矿泉水" CATEGORY="Table" PARTNUM="12" PLANT="Chicago">
        <SPECIFICATIONS WEIGHT="20" POWER="18">这里是细节</SPECIFICATIONS>
        <PRICE>25</PRICE>
        <PRICE>28</PRICE>
    </PRODUCT></CATALOG>

然后我们用Microsoft.XMLDOM校验该XML,会发明没有任何毛病。然则要注意编码。

1.XML文件束缚与DTD的简朴引见

我们编写文档来束缚一个XML文档的誊写范例,这称之为XML束缚。

经常运用的束缚手艺有:

  • XML DTD

  • XML Schema

DTD的基础概念:

document type definition 文档范例定义

DTD文件平常和XML文件合营运用,重要是为了束缚XML文件。

XML文件引入DTD文件,如许XML可以自定义标签,但又遭到DTD文件的束缚。比方上一节运用XML形貌一个班级的信息,假如我们给每个门生定义一个<面积>标签,语法上也是没有毛病的,然则不符合语义,门生怎么可以用面积来形貌呢?这时刻我们就需要用到DTD文件来束缚这个XML。

<?xml version="1.0" encoding="gb2312"?><class>
    <stu id="001">
        <name>杨过</name> 
        <sex>男</sex>
        <age>20</age>
        <面积>100</面积>
    </stu></class>

1.1 DTD束缚疾速入门案例

基础语法:

<!ELEMENT 元素名 范例>

我们还以班级为例,编写以下DTD文件,myClass.dtd:

<!ELEMENT 班级 (门生+)><!ELEMENT 门生 (名字,岁数,引见)><!ELEMENT 名字 (#PCDATA)><!ELEMENT 岁数 (#PCDATA)><!ELEMENT 引见 (#PCDATA)>

第一行示意根元素为班级,而且有门生这个子元素,子元素为1或许多个。
第二行示意门生的子元素为名字,岁数,引见
名字下面没有子元素了,那末#PCDATA示意名字内里可以听任意文本。
岁数和引见也是相似。

编写myClass.xml文件并引入DTD文件以下:

<?xml version="1.0" encoding="utf-8"?><!--引入dtd文件,束缚这个xml--><!DOCTYPE 班级 SYSTEM "myClass.dtd"><班级>
    <门生>
        <名字>周小星</名字>    
        <岁数>23</岁数>
        <引见>进修受苦</引见>
    </门生>   
    <门生>
        <名字>林晓</名字> 
        <岁数>25</岁数>
        <引见>是一个好门生</引见>
    </门生>   </班级>

引入中写的:SYSTEM,示意当前的DTD文件是当地的
假如写的是PUBLIC,则示意引入的DTD文件是来自于收集的.

这时刻引入的DTD文件是没有发生作用的,假如我们在门生元素中增加子元素<面积>,翻开这个XML文件,浏览器依旧不会报错。

<?xml version="1.0" encoding="utf-8"?><!--引入dtd文件,束缚这个xml--><!DOCTYPE 班级 SYSTEM "myClass.dtd"><班级>
    <门生>
        <名字>周小星</名字>    
        <岁数>23</岁数>
        <引见>进修受苦</引见>
        <面积>100平米</面积>
    </门生>   
    <门生>
        <名字>林晓</名字> 
        <岁数>25</岁数>
        <引见>是一个好门生</引见>
    </门生>   </班级>

我们需要编程校验XML文档的正确性

IE5以上的浏览器内置了XML剖析东西:Microsoft.XMLDOM,开发人员可以编写JavaScript代码,运用这个剖析东西装载XML文件,并对XML文件举行DTD考证。

我们编写myXmlTools.html来对这个XML举行校验,以下:

<html>
    <head>
    <!--本身编写一个简朴的剖析东西,去剖析XML DTD是不是配套-->     
    <script language="javascript">
        // 建立xml文档剖析器对象
        var xmldoc = new ActiveXObject("Microsoft.XMLDOM");        // 开启xml校验
        xmldoc.validateOnParse = "true";        // 装载xml文档,即指定校验哪一个XML文件
        xmldoc.load("myClass.xml");
        document.writeln("毛病信息:"+xmldoc.parseError.reason+"<br>");
        document.writeln("毛病行号:"+xmldoc.parseError.line);    </script>

    </head>
    <body>

    </body></html>

用IE浏览器翻开这个html文件,可以看到运转效果:

可以看到第9行恰是我们增加的<面积>这一行。

2.DTD细节

2.1 DTD文档的声明及援用

1.内部DTD文档

<!DOCTYPE 根元素 [定义内容]>

2.外部DTD文档

引入外部的DTD文档分为两种:

(1)当援用的DTD文件是当地文件的时刻,用SYSTEM标识,并写上”DTD的文件途径”,以下:

<!DOCTYPE 根元素 SYSTEM "DTD文件途径">

(2)假如援用的DTD文件是一个大众的文件时,采纳PUBLIC标识,以下体式格局:

<!DOCTYPE 根元素 PUBLIC "DTD称号" "DTD文件的URL">

比以下例:

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems,Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

2.2 DTD基础语法:

<!ELEMENT NAME CONTENT>

个中:
- ELEMENT是关键字,是不能修正的
- NAME示意元素称号
- CONTENT是元素范例,必需要大写!CONTENT的内容有三种写法:

(1)EMPTY——示意该元素不能包含子元素和文本,但可以有属性。
(2)ANY——示意该元素可以包含任安在该DTD中定义的元素内容
(3)#PCDATA——可以包含任何字符数据,然则不能在个中包含任何子元素

2.3 DTD元素的组合范例:

DTD中如许划定:

<!ELEMENT 家庭(人+,家电*)>

这个DTD划定了家庭元素中可以有1到多个”人”这个子元素,也可以有0到多个”家电”这个子元素。个中的加号”+”和星号”*”的寄义与正则表达式中的寄义一致。

XML如许写:

<家庭>
    <人 名字="张晓明" 性别="男" 岁数="25"/>
    <人 名字="李小钢" 性别="男" 岁数="36" 兴趣="作个教诲家和巨人"/>
    <家电 称号="彩电" 数目="3"/></家庭>

关于组合范例,有下述的的修饰符可以运用:

标记 用处 示例 示例申明
() 用来给元素分组 (古龙|金庸),(王朔|余杰) 分红两组
| 在列出的对象中挑选一个 (男子|女人) 示意男子或许女人必需涌现,二者至少选其一
+ 该对象必需涌现一次或许屡次 (成员+) 示意成员必需涌现,而却可以涌现多个成员
* 该对象许可涌现0次或许屡次 (兴趣*) 兴趣可以涌现两次到屡次
? 该对象必需涌现0次或许1次 (菜鸟?) 菜鸟可以涌现,也可以不涌现,假如涌现的话,最多只能涌现一次
, 对象必需按指定的递次涌现 (西瓜,苹果,香蕉) 示意西瓜、苹果、香蕉必需涌现,而且按这个递次涌现

2.4 属性定义

DTD中属性的定义是如许的:

<!ATTLIST 元素称号
    属性称号 范例 属性特性
    属性称号 范例 属性特性......  >

个中,属性的范例有下面5种:

(1) CDATA
(2) ID
(3) IDREF/IDREFS
(4) Enumerated
(5) ENTITY/ENTITIES

属性的特性有以下4种:

(1) #REQUIRED,示意这个属性必需给,不给就报错
(2) #IMPLIED,示意这个属性可以给也可以不给
(3) #FIXED value,示意这个属性必需给一个牢固的value值
(4) Default value,示意这个属性假如没有值,就分派一个默许的value值

比方,我们想在门生这个子元素上加上地点这个属性,而且这个属性是必需的,示例以下:

<?xml version="1.0" encoding="utf-8"?><!DOCTYPE 班级 SYSTEM "myClass.dtd"><班级>
    <门生 地点="香港">
        <名字>周小星</名字>    
        <岁数>23</岁数>
        <引见>进修受苦</引见>
    </门生>   
    <门生 地点="澳门">
        <名字>林晓</名字> 
        <岁数>25</岁数>
        <引见>是一个好门生</引见>
    </门生>   </班级>

这个时刻响应的DTD文件也要更新,不然就会报错,以下:

<!ELEMENT 班级 (门生+)><!ELEMENT 门生 (名字,岁数,引见)><!ATTLIST 门生
    地点 CDATA #REQUIRED><!ELEMENT 名字 (#PCDATA)><!ELEMENT 岁数 (#PCDATA)><!ELEMENT 引见 (#PCDATA)>

2.4.1 关于属性范例的细致诠释

(1)属性范例-CDATA,示意属性值可以是任何字符(包含中文和数字)

<!ATTLIST 木偶
    姓名 CDATA #REQUIRED>
<木偶 姓名="匹诺曹"/><木偶 姓名="PiNuocao"/><木偶 姓名="123"/>

(2)属性范例-ID,表明该属性的取值必需是唯一的,然则属性的值不能是以数字开首!

<!ELEMENT 公司人员 ANY><!ATTLIST 公司人员
    编号 ID #REQUIRED
    姓名 CDATA #REQUIRED>
<公司人员 编号="Z001" 姓名="张三"/><公司人员 编号="Z002" 姓名="李思"/>

(3)属性范例-IDREF/IDREFS
- IDREF属性的值指向文档中别的处所声明的ID范例的值
- IDREFS同IDREF,然则可以具有由空格离开的多个援用。

<!ELEMENT 家庭(人+)><!ELEMENT 人 EMPTY><!ATTLIST 人    relID ID #REQUIRED
    paraentID IDREFS #IMPLIED
    name CDATA #REQUIRED>
<家庭>
    <人 relID="P_1" name="爸爸"/>
    <人 relID="P_2" name="妈妈"/>
    <人 relID="P_3" parentID="P_1 P_2" name="儿子"/></家庭>

(4)属性范例-Enumerated,事前定义好一些值,属性的值必需在所列出的值的范围内。

<!ATTLIST person
    婚姻状况 (single|married|porced|widowed) #IMPLIED><!ATTLIST person
    性别 (男|女) #REQUIRED>

(5)属性范例-ENTITY,实体

实体定义:
- 实体用于为一段内容建立一个别号,今后在XML文档中就可以运用别号援用这段内容了。
- 在DTD定义中,一条!ENTITY语句用于定义一个实体。
- 实体可分为两种范例:援用实体和参数实体。援用实体是被XML文档运用的,而参数实体是被DTD文件本身运用的。

①援用实体:

  • 援用实体重要在XML文档中被运用
    语法花样以下,援用实体的定义内容最好放在DTD文件的末了。

<!ENTITY 实体称号 "实体内容">

援用体式格局:&实体称号; 末端要带上分号,这个援用将直接转变成实体内容

举例以下:

<!ENTITY copyright "I am a programmer">....
&copyright;

②参数实体:

参数实体被DTD文件本身运用
语法花样为:

<!ENTITY % 实体称号 "实体内容">

援用体式格局为:%实体称号

举例:

<!ENTITY % TAG_NAME "姓名|EMAIL|电话|地点"><!ELEMENT 个人信息 (%TAG_NAME;|生日)><!ELEMENT 客户信息 (%TAG_NAME;|公司名)>

3.DTD现实案例

进修DTD的目的在于:
(1)请求我们可以看得懂DTD文件,
(2)我们可以依据给出的DTD写出对应的XML文件

下面我们看一个案例,下述的DTD文件是从W3School在线教程中的DTD案例中拿过来的,细看每一行,我们都应该可以看得懂。

<!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 PRODUCTNAME CDATA #IMPLIEDCATEGORY (HandTool|Table|Shop-Professional) "HandTool"PARTNUM CDATA 
#IMPLIEDPLANT (Pittsburgh|Milwaukee|Chicago) "Chicago"INVENTORY (InStock|Backordered|Discontinued) "InStock">
<!ELEMENT SPECIFICATIONS (#PCDATA)>
<!ATTLIST SPECIFICATIONSWEIGHT CDATA #IMPLIEDPOWER CDATA #IMPLIED>
<!ELEMENT OPTIONS (#PCDATA)>
<!ATTLIST OPTIONSFINISH (Metal|Polished|Matte) "Matte" 
ADAPTER (Included|Optional|NotApplicable) "Included"CASE (HardShell|Soft|NotApplicable) "HardShell">
<!ELEMENT PRICE (#PCDATA)>
<!ATTLIST PRICEMSRP CDATA #IMPLIEDWHOLESALE CDATA #IMPLIEDSTREET CDATA #IMPLIEDSHIPPING CDATA #IMPLIED>
<!ELEMENT NOTES (#PCDATA)>

然后我们可以依据该DTD编写以下最简朴的XML文件:

<?xml version="1.0" encoding="utf-8"?><!DOCTYPE CATALOG SYSTEM "product.dtd"><CATALOG>
    <PRODUCT NAME="康帅傅矿泉水" CATEGORY="Table" PARTNUM="12" PLANT="Chicago">
        <SPECIFICATIONS WEIGHT="20" POWER="18">这里是细节</SPECIFICATIONS>
        <PRICE>25</PRICE>
        <PRICE>28</PRICE>
    </PRODUCT></CATALOG>

然后我们用Microsoft.XMLDOM校验该XML,会发明没有任何毛病。然则要注意编码。

以上就是XML—XML文件束缚之DTD详解的内容,更多相关内容请关注ki4网(www.ki4.cn)!

标签:XML文件约束DTD详解


欢迎 发表评论: