文档定义类型

文档类型定义

DTD的概念

DTD的作用就是定义允许哪些或者不允许哪些内容在文档中出现。

如果一个XML文档的愈发符合DTD的规定,那么它就是就是一个合法有效的XML文档

作用:

​ 对XML进行语义定义的约束

约束的几个方面:

  1. 对元素的内容约束
  2. 有那些元素
  3. 元素是否是空的、或是有文本、或有子元素
  4. 元素的属性有哪些
  5. 属性的值是什么类型的、有没有默认值
  6. ...........

DTD的调用

一、引入DTD

内部的;(嵌入到XML中)

原
<?xml version="1.0" encoding="GB2312" standalone="yes"?>
<!--Prolog区还包含指令 -->

<note type="message">
<to>lvqi</to>
<from>pingdu</from>
<heading>reminder</heading>
<body> dont forget eat grass!</body>
</note>
<?xml version="1.0" encoding="GB2312" standalone="yes"?>
<!--Prolog区还包含指令 -->
<!--内部DTD -->
只能用于当前的xml,在单独的文本中却可以应用于多个
优点  简单
<!DOCTYPE 根元素名称[
其他元素
]>
<note type="message">
<to>lvqi</to>
<from>pingdu</from>
<heading>reminder</heading>
<body> dont forget eat grass!</body>
</note>


外部的;(独立的文档 dtd)

mydtd.dtd

<?xml version="1.0" encoding="GB2312" standalone="yes"?>
<!-- 注意: encoding的值与XML中的值一定是一样的 -->
<!-以下为DTD定义  ->
<!--引入u外部DTD-->
<!DOCTYPE 根元素名称 SYSTEM "DTD文件URL">

公共的

<!--public公共的 -->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">

DTD的结构

DTD文档不是XML文档 它有一套自己的语义定义

第一行 :

<?xml version="1.0" encoding="GB2312"  ?>

元素的声明

后面是DTD定义:

​ 元素定义:

<!ELEMENT ...>

​ 属性定义

<!ATTLIST  ...>

​ 实体定义

<!ENTITY ...>

元素定义:

<!ELEMENT element name element.type>
<!DOCTYPE note[
<!ELEMENT note (to,from,heading,body)>  <!--定义有序列子元素的 -->
<!ELEMENT to (#PCDATA)>			 <!--定义有文本数据的元素 --> <!--注释验证时按错误处理-->
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note type="message">
<to>lvqi</to>
<from>pingdu</from>
<heading>reminder</heading>
<body> dont forget eat grass!</body>
</note>

1.定义有序列子元素的元素

<!ELEMENT element name (子元素1,子元素2,....)>

注意:

1.顺序很重要 所有的元素也必须定义

2.定义有文本数据的元素

<!ELEMENT element name (#PCDATA)>

验证DTD

<head>
    <meta charset="UTF-8">
    <title></title>
    <script language="JavaScript">
        //XML解析器 只适用于IE
    	var xmldoc=new ActiveXObject("Microsoft.XMLDOM");
        //开启XML验证
        xmldoc.validateOnParse="true";
        //加载要验证的XML文档
        xmldoc.load("XML");
        //错误代码
        document.write("errorCode:"+xmldoc.parseError.errorCode+<br/>)
       // xmldoc.parseError.errorCode
        //错误原因
        document.write("reason"+xmldoc.parseError.reason)
       // xmldoc.parseError.reason
        //错误行
        document.write("line"+xmldoc.parseError.line)
        //xmldoc.parseError.line
    </script>
</head>
//与要验证的文件放在一个文件夹下
<?xml version="1.0" encoding="GB2312" standalone="yes"?>
<!DOCTYPE note[
<!ELEMENT note (to,from,heading,body)>  
<!ELEMENT to (#PCDATA)>			
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>lvqi</to>
<from>pingdu</from>
<heading>reminder</heading>
<body> dont forget eat grass!</body>
</note>

3.定义有互斥子元素的元素

<!ELEMENT element name (子元素1|子元素2|....)>
<!ELEMENT note (to|from|heading|body)>  
互斥,只能有一个  to 或其他的其中一个
<note>
<to>lvqi</to>
</note>

4.定义空(empty)元素 <br/

<!ELEMENT element name EMPTY>

<?xml version="1.0" encoding="GB2312" standalone="yes"?>
<!DOCTYPE note[
<!ELEMENT note (to,from,heading,body)>  
<!ELEMENT to (#PCDATA)>			
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body EMPTY>
]>
<note>
<body></body>   <!--<body/>-->
</note>

5.定义元素重复的频次

三个标记:

''+'' :1~n

'*' :0~n

'?' :0~1

出现一次 不用加任何标记

<?xml version="1.0" encoding="GB2312" standalone="yes"?>
<!DOCTYPE note[
<!ELEMENT note (to?,from?,heading,body*)>   <!--在该行加-->  
<!ELEMENT to (#PCDATA)>			
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>

<from>pingdu</from>
<heading>reminder</heading>
<body> dont forget eat grass!</body><body> dont forget eat grass!</body>
    <body> dont forget eat grass!</body><body> dont forget eat grass!</body>
</note>

6.组合元素(),构成一组

<?xml version="1.0" encoding="GB2312" standalone="yes"?>
<!DOCTYPE note[
<!ELEMENT note (to,from,(heading|body)*)>  
<!ELEMENT to (#PCDATA)>			
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>lvqi</to>
<from>pingdu</from>

<body> dont forget eat grass!</body><body> dont forget eat grass!</body>
    <body> dont forget eat grass!</body><body> dont forget eat grass!</body>
</note>

7.定义 任意类型的元素(ANY)

<!ELEMENT element name ANY>

没有什么约束作用 了

<?xml version="1.0" encoding="GB2312" standalone="yes"?>
<!DOCTYPE note[
<!ELEMENT note ANY>
]>
<note>
message
</note>

实体的声明

<!ENTITY 实体名称 "实体值">

按照声明的位置,分内部实体和外部实体

<?xml version="1.0" encoding="GB2312" standalone="yes"?>
<!DOCTYPE note[
<!ELEMENT note (to)>  
<!ELEMENT to (#PCDATA)>			
<!ENTITY myen "hello world">
]>
<note>
<to>lvqi</to>
</note>

实体的引用(在XML中引用)

&实体名称; 分号必不可少(引用实体:三部分,& 实体名称 ";")

内部实体声明

<?xml version="1.0" encoding="GB2312" standalone="yes"?>
<!DOCTYPE note[
<!ELEMENT note (to,from,heading,body)>  
<!ELEMENT to (#PCDATA)>			
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
<!ENTITY myen "hello world">
]>
<note>
<to>lvqi</to>
<from>pingdu</from>
<heading>&myen;</heading>
<body> dont forget eat grass!</body>
</note>

外部声明

<!ENTITY 实体名称 SYSTEM "DTD的URL"

属性的声明

<!ATTLIST 元素的名称 属性的名称 属性的类型 属性值  >
<?xml version="1.0" encoding="GB2312" standalone="yes"?>
<!DOCTYPE note[
<!ELEMENT note (to,from,heading,body)>  
<!ELEMENT to (#PCDATA)>			
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
<!ENTITY myen "hello world">
<!ATTLIST note type CDATA "string">
]>
<note type="XXXXX">
<to>lvqi</to>
<from>pingdu</from>
<heading>&myen;</heading>
<body> dont forget eat grass!</body>
</note>

属性的默认值

DTD:

<!ATTLIST note type1 CDATA "string">

xml:

<note type1="hello"></note>

属性值必须设置值 (#REQUIRED)

<!ATTLIST note type CDATA #REQUIRED>
<note type2="XX"></note>

属性值不限制 (#IMPLIED)

<!ATTLIST to type3 CDATA #IMPLIED>
<to></to>
<to type3="fsfsf"></to>

固定的值 (#FIXED)

<!ATTLIST to logo CDATA #FIXED "inspur">
<to logo="inspur"></to>

属性值多选一

<!ATTLIST head head1 (1|3|5|7) "3">
<!--默认3-->
<head head1="1"></head>

ID

<!ATTLIST to myid ID #REQUIRED>
<to myid="a1"></to>
posted @ 2021-03-02 11:34  弹琴的猫  阅读(107)  评论(0)    收藏  举报