每天多一点之DTD
1、DTD基本概念:
DTD ( document type definition 文档类型定义),该文件一般和xml文件配合使用, 主要的用处是约束 xml, 除了dtd 技术外,
还有一个schema的技术也可以用于约束xml文件的书写规范.
2、基本语法:
<!ELEMENT 元素名 类型>
类型:
EMPTY-该元素不能包含子元素和文本,但可以有属性-(空元素)
ANY-该元素可以包含任何在DTD中定义的元素内容
#PCDATA-可以包含任何字符数据,但是不能在其中包含任何子元素
其它类型(组合)
空元素:
<!ELEMENT 元素名称 EMPTY>例子:
<!ELEMENT br EMPTY>XML例子:
<br />
带有任何内容的元素:通过类别关键词 ANY 声明的元素,可包含任何可解析数据的组合:
<!ELEMENT 元素名称 ANY>例子:
<!ELEMENT note ANY>
PCDATA :只有 PCDATA 的元素通过圆括号中的 #PCDATA 进行声明:
<!ELEMENT 元素名称 (#PCDATA)>例子:
<!ELEMENT from (#PCDATA)>
<!ELEMENT 元素名称 (元素内容)>
带有子元素(序列)的元素带有一个或多个子元素的元素通过圆括号中的子元素名进行声明:
<!ELEMENT 元素名称 (子元素名称 1)>或者
<!ELEMENT 元素名称 (子元素名称 1,子元素名称 2,.....)>例子:<!ELEMENT note (to,from,heading,body)>当子元素按照由逗号分隔开的序列进行声明时,这些子元素必须按照相同的顺序出现在文档中。在一个完整的声明中,
子元素也必须被声明,同时子元素也可拥有子元素。"note" 元素的完整声明是:
<!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)>
声明只出现一次的元素:<!ELEMENT 元素名称 (子元素名称)>例子:
<!ELEMENT note (message)>上面的例子声明了:message 子元素必须出现一次,并且必须只在 "note" 元素中出现一次。
声明最少出现一次的元素
<!ELEMENT 元素名称 (子元素名称+)>例子:
<!ELEMENT note (message+)>上面的例子中的加号声明了:message 子元素必须在 "note" 元素内出现至少一次。
声明出现零次或多次的元素
<!ELEMENT 元素名称 (子元素名称*)>例子:
<!ELEMENT note (message*)>上面的例子中的星号声明了:子元素 message 可在 "note" 元素内出现零次或多次。
声明出现零次或一次的元素
<!ELEMENT 元素名称 (子元素名称?)>例子:
<!ELEMENT note (message?)>上面的例子中的问号声明了:子元素 message 可在 "note" 元素内出现零次或一次。
声明“非.../既...”类型的内容
例子:
<!ELEMENT note (to,from,header,(message|body))>上面的例子声明了:"note" 元素必须包含 "to" 元素、"from" 元素、"header" 元素,以及非 "message" 元素既 "body" 元素。
声明混合型的内容
例子:
<!ELEMENT note (#PCDATA|to|from|header|message)*>上面的例子声明了:"note" 元素可包含出现零次或多次的 PCDATA、"to"、"from"、"header" 或者 "message"。
声明属性
1、属性声明拥使用下列语法:
<!ATTLIST 元素名称 属性名称 属性类型 默认值>
注:以ID为类型的属性值,不能重复.实体(ENTITY):
引用实体
在 dtd 中定义:
<!ENTITY mycopy "我的版权">
在xml中引用:
<a>Hackerd &mycopy;</a>
参数实体
在 dtd 中定义:
<!ENTITY % name “姓名">
在dtd中引用:
<!ELEMENT %name; (#PCDATA)>
3、 DTD 的分类
内部DTD文档
<!DOCTYPE 根元素 [定义内容]>
外部DTD文档
<!DOCTYPE 根元素 SYSTEM "DTD文件路径">
4、外部DTD文档声明的两种方式:
•当引用的文件在本地时,采用如下方式:
<!DOCTYPE 文档根结点 SYSTEM "DTD文件的URL">
例如: <!DOCTYPE 书架 SYSTEM “book.dtd”>。
•当引用的文件是一个公共的文件时,采用如下方式:
<!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">
5、完成校验的html
<html> <head> <!--一个简单的解析工具,去解析xml与dtd 是否匹配--> <script language="javascript"> <!-- var xmldoc = new ActiveXObject("Microsoft.XMLDOM"); xmldoc.validateOnParse = "true";//开启校验 xmldoc.load("***.xml");//指定校验哪个xml文件 document.writeln("错误代码是:"+xmlDoc.parseError.errorCode+"<br/>"); document.writeln("错误信息是:"+xmldoc.parseError.reason+"<br/>"); document.writeln("错误的行是:"+xmldoc.parseError.line); //--> </script> </head> <body> </body> </html>
6、案例
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 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)>
XML:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE CATALOG SYSTEM 'product.dtd'> <CATALOG> <PRODUCT NAME="康师傅矿泉水" CATEGORY="HandTool" PARTNUM="abc" PLANT="Milwaukee" INVENTORY="Backordered"> <SPECIFICATIONS WEIGHT="800" POWER="600" >这里是细节</SPECIFICATIONS> <PRICE>110</PRICE> </PRODUCT> </CATALOG>