每天多一点之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 元素名称 (元素内容)>
image

带有子元素(序列)的元素

    带有一个或多个子元素的元素通过圆括号中的子元素名进行声明:

  <!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 元素名称 属性名称 属性类型 默认值>
image
:以ID为类型的属性值,不能重复.

           实体(ENTITY):

              引用实体

              在 dtd 中定义:

             <!ENTITY mycopy "我的版权">

              在xml中引用:

              <a>Hackerd &mycopy;</a>

              参数实体

             在 dtd 中定义:

              <!ENTITY % name “姓名">

             在dtd中引用:

             <!ELEMENT %name; (#PCDATA)>

         

image
 
 

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>
原文地址:https://www.cnblogs.com/hackerd/p/3097493.html