文档定义类型
文档类型定义
DTD的概念
DTD的作用就是定义允许哪些或者不允许哪些内容在文档中出现。
如果一个XML文档的愈发符合DTD的规定,那么它就是就是一个合法有效的XML文档
作用:
对XML进行语义定义的约束
约束的几个方面:
- 对元素的内容约束
- 有那些元素
- 元素是否是空的、或是有文本、或有子元素
- 元素的属性有哪些
- 属性的值是什么类型的、有没有默认值
- ...........
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>