1、DTD概要:
1)、dtd用来干啥的:用来定义和验证xml文件格式合法性的,比如说:你要写一个xml文件,它需要指定一个根元素,然后根元素下面还会有一批的子元素,有些元素或许还有属性,那这一大批的东西都是在dtd里来定义的。 官方的解释就是:文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。 2)、怎么在xml中应用dtd: 第一种方式是:直接在xml文件里写dtd定义,声明如下: <!DOCTYPE 根元素 [元素声明]> 如下: --------- <!DOCTYPE persons [ <!ELEMENT persons (person)> <!ELEMENT person (name,age)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> ]> ---------- 第二种方式是在xml引入dtd文件: <!DOCTYPE 根元素 PUBLIC/SYSTEM "dtd路径名"> ----------- <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE classroom SYSTEM "classroom.dtd"> -----------
2、DTD元素的写法:
1)、元素的写法:<!ELEMENT ...> 2)、例子: --------- <!DOCTYPE persons [ <!ELEMENT persons (person)> <!ELEMENT person (name,age)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> ]> ---------- 以上 DTD 解释如下: !DOCTYPE persons (第二行)定义此文档是 persons 类型的文档。 !ELEMENT person (第三行)定义 person 元素有2个元素:"name,age" !ELEMENT name (第四行)定义 name 元素为 "#PCDATA" 类型 !ELEMENT age (第五行)定义 age 元素为 "#PCDATA" 类型 ----------
3、DTD属性的写法:
1)、<!ATTLIST 元素名称 属性名称 属性类型 默认值> 2)、例子: <!ATTLIST person sex CDATA "人妖"> <!ATTLIST person sex CDATA #REQUIRED> <!-- 表示该属性值是必须的 没有则xml验证不通过--> <!ATTLIST person sex CDATA #IMPLIED> <!-- 表示该属性值不是必须的 没有则xml验证也没问题--> <!ATTLIST person sex CDATA #FIXED "中性"> <!-- 表示该一旦元素出现该属性,值是固定的 -->
4、元素正则验证:
1)、符号: ?表示0次或1次 * 表示0次或多次 + 表示1次或多次 a|b 表示非a即b 默认表示1次 2)、例子: -------------------------- <!ELEMENT person (name+,age,password?,nickname*)> 以上就表示person这个元素下的子元素:name元素最少存在一个,age元素只出现一个,password元素可以不出现,出现的话最多一次,nickname可以不出现,也可以出现多次。 --------------------------- <person> <name>傻逼1</name> <!-- name元素至少出现一次,否则xml验证不通过--> <age>20</age> <!-- age元素一定要出现且仅能出现一次,如果有多个xml验证也不通过--> <password>>123</password> <!-- password元素没有也无所谓--> <nickname>sb</nickname> <!-- nickname元素没有也无所谓--> </person> ---------------------------
5、一个完整的DTD例子:
<?xml version="1.0" encoding="UTF-8"?> <!-- 根元素为classroom 包含name,grade,students三个子元素--> <!ELEMENT classroom (classname,gradename,students)> <!-- classroom有一个属性名为id 属性类型为ID类型 唯一且必须要有--> <!ATTLIST classroom id ID #REQUIRED> <!-- 声明子元素name--> <!ELEMENT classname (#PCDATA)> <!-- 声明子元素grade--> <!ELEMENT gradename (#PCDATA)> <!-- 声明子元素students 这个元素又包括了多个student子元素 带了+号表示至少一个或多个--> <!ELEMENT students (student+)> <!-- 声明子元素student 包含code(有或没有,最多出现一次),name,age三个子元素--> <!ELEMENT student (code?,name,age)> <!-- student有一个属性名为id 属性类型为ID类型 唯一且必须要有--> <!ATTLIST student id ID #REQUIRED> <!-- student有一个属性名为sex 默认值为男--> <!ATTLIST student sex CDATA "男"> <!-- 声明子元素code--> <!ELEMENT code (#PCDATA)> <!-- 声明子元素name--> <!ELEMENT name (#PCDATA)> <!-- 声明子元素age--> <!ELEMENT age (#PCDATA)>
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE classroom SYSTEM "classroom.dtd"> <classroom id="ss"> <classname>一班</classname> <gradename>一年级</gradename> <students> <student id="s1" sex="男"> <code>1111110000000</code> <name>傻逼</name> <age>20</age> </student> <student id="s2"> <name>傻帽</name> <age>49</age> </student> </students> </classroom>
6、Schema概要:
1)、什么是XML Schema:基于 XML 的 DTD 替代者。 定义可出现在文档中的元素 定义可出现在文档中的属性 定义哪个元素是子元素 定义子元素的次序 定义子元素的数目 定义元素是否为空,或者是否可包含文本 定义元素和属性的数据类型 定义元素和属性的默认值以及固定值 2)、与dtd相比优点: XML Schema 可针对未来的需求进行扩展 XML Schema 更完善,功能更强大 XML Schema 基于 XML 编写 XML Schema 支持数据类型 XML Schema 支持命名空间 3)、XML Schema 最重要的能力之一就是对数据类型的支持。 通过对数据类型的支持: 可更容易地描述允许的文档内容 可更容易地验证数据的正确性 可更容易地与来自数据库的数据一并工作 可更容易地定义数据约束(data facets) 可更容易地定义数据模型(或称数据格式) 可更容易地在不同的数据类型间转换数据 4)、XML Schema 使用 XML 语法 5)、XML Schema 可保护数据通信:一个带有数据类型的 XML 元素可以保证通信双方都能很好的理解。
7、新建一个Schema:
1)、格式如下: ----------------------------------- <?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/01" xmlns:tns="http://www.example.org/01" elementFormDefault="qualified"> </schema> ----------------------------------- 2)、xml对schema的引用: ----------------------------------- <?xml version="1.0" encoding="UTF-8"?> <tns:classroom xmlns:tns="http://www.example.org/01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/01 01.xsd "> -----------------------------------
8、格式解释:
1)、<schema> 元素是每一个 XML Schema 的根元素。 2)、xmlns:xs="http://www.w3.org/2001/XMLSchema":显示 schema 中用到的元素和数据类型来自命名空间 "http://www.w3.org/2001/XMLSchema"。同时它还规定了来自命名空间 "http://www.w3.org/2001/XMLSchema" 的元素和数据类型应该使用前缀 xs 3)、targetNamespace="http://www.w3school.com.cn" :显示被此 schema 定义的元素 (note, to, from, heading, body) 来自命名空间http://www.example.org/01 4)、xmlns="http://www.example.org/01" :指出本schema默认的命名空间是http://www.example.org/01 5)、elementFormDefault="qualified" :指出任何 XML 实例文档所使用的且在此 schema 中声明过的元素必须被命名空间限定。 6)、引用schema时xmlns:tns="http://www.example.org/01" :规定了默认命名空间的声明。此声明会告知 schema 验证器,在此 XML 文档中使用的所有元素都被声明于 "http://www.example.org/01" 这个命名空间。 7)、xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" :XML Schema 实例命名空间 8)、xsi:schemaLocation="http://www.example.org/01 01.xsd ":需要使用的命名空间。
9、schema元素:
1)、简单元素:语法<element name="xxx" type="yyy"/> ------------------------------- <element name="lastname" type="string"/> <element name="age" type="integer"/> <element name="dateborn" type="date"/> ------------------------------- 2)、复杂元素: ------------------------------- 第一种:只有一个属性名的元素 比如:<person age="123"/> --------- <element name="person"> <complexType> <attribute name="age" type="int" /> </complexType> </element> 或者把type放到外面来定义,元素那里直接引用 --------- 第二种:只包括了几个元素的元素(常见的) 比如: <person> <firstname>John</firstname> <lastname>Smith</lastname> </person> --------- <element name="person"> <complexType> <sequence> <element name="firstname" tyep="string"/> <element name="lastname" type="string"/> </sequence> </complexType> </element> --------- 第三种:只包含文本的元素 <shoes country="france">35</shoes> --------- <element name="shoes"> <complexType> <simpleContent> <!-- 内容被定义成String类型 --> <extension base="int"> <!-- 属性county --> <attribute name="county" type="string"/> </extension> </simpleContent> </complexType> </element> --------- 第四种:乱七八糟,什么都包含了的元素。 <letter> Dear Mr.<name>John Smith</name>. Your order <orderid>1032</orderid> will be shipped on <shipdate>2001-07-13</shipdate>. </letter> 以上这种元素和子元素之间还夹杂一些字符,简直就是乱七八糟 其实和第二种很像,唯一需要更改的就是<complexType mixed="true"> --------- <xs:element name="letter"> <xs:complexType mixed="true"> <xs:sequence> <xs:element name="name" type="xs:string"/> <xs:element name="orderid" type="xs:positiveInteger"/> <xs:element name="shipdate" type="xs:date"/> </xs:sequence> </xs:complexType> </xs:element> ---------
10、指示器:
1)、<all> <all> 指示器规定子元素可以按照任意顺序出现,且每个子元素必须只出现一次: -------- <xs:element name="person"> <xs:complexType> <xs:all> <xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string"/> </xs:all> </xs:complexType> </xs:element> -------- 2)、<choice> <choice> 指示器规定可出现某个子元素或者可出现另外一个子元素(非此即彼): ------- <xs:element name="person"> <xs:complexType> <xs:choice> <xs:element name="employee" type="employee"/> <xs:element name="member" type="member"/> </xs:choice> </xs:complexType> </xs:element> ------- 3)、<sequence> <sequence> 规定子元素必须按照特定的顺序出现: ------- <xs:element name="person"> <xs:complexType> <xs:sequence> <xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> ------- 4)、<maxOccurs> <minOccurs> <maxOccurs> 指示器可规定某个元素可出现的最大次数: <minOccurs> 指示器可规定某个元素能够出现的最小次数: minOccurs默认值是1 -------- <xs:element name="person"> <xs:complexType> <xs:sequence> <xs:element name="full_name" type="xs:string" minOccurs="0"/> <xs:element name="child_name" type="xs:string" maxOccurs="10"/> </xs:sequence> </xs:complexType> </xs:element> -------- 提示:如需使某个元素的出现次数不受限制,请使用 maxOccurs="unbounded" 这个声明 5)、元素组:group Group 指示器用于定义相关的数批元素。这个相当于是一批元素的集合 -------- <xs:group name="persongroup"> <xs:sequence> <xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string"/> <xs:element name="birthday" type="xs:date"/> </xs:sequence> </xs:group> <xs:element name="person" type="personinfo"/> <xs:complexType name="personinfo"> <xs:sequence> <xs:group ref="persongroup"/> <xs:element name="country" type="xs:string"/> </xs:sequence> </xs:complexType> -------- 6)、属性组:attributeGroup 属性组通过 attributeGroup 声明来进行定义: --------- <xs:attributeGroup name="personattrgroup"> <xs:attribute name="firstname" type="xs:string"/> <xs:attribute name="lastname" type="xs:string"/> <xs:attribute name="birthday" type="xs:date"/> </xs:attributeGroup> <xs:element name="person"> <xs:complexType> <xs:attributeGroup ref="personattrgroup"/> </xs:complexType> </xs:element> ---------
11、一个完整的例子:
<?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/01" xmlns:tns="http://www.example.org/01" elementFormDefault="qualified"> <!-- 定义简单元素类型 --> <simpleType name="stringtype" > <restriction base="string"/> </simpleType> <simpleType name="idtype" > <restriction base="ID"/> </simpleType> <simpleType name="sextype"> <restriction base="tns:stringtype"> <pattern value="男|女"/> </restriction> </simpleType> <simpleType name="inttype" > <restriction base="int"> <maxExclusive value="100"/> <minExclusive value="10"/> </restriction> </simpleType> <element name="classroom"> <complexType> <sequence> <element name="classname" type="tns:stringtype"/> <element name="gradename" type="tns:stringtype" minOccurs="0" maxOccurs="1"/> <element name="students"> <complexType> <sequence> <element name="student" maxOccurs="unbounded"> <complexType> <sequence> <element name="code" type="tns:stringtype" maxOccurs="1"/> <element name="name" type="tns:stringtype"/> <element name="age" type="tns:inttype"/> </sequence> <attribute name="sex" type="tns:sextype"/> </complexType> </element> </sequence> </complexType> </element> </sequence> <attribute name="id" type="tns:idtype"/> </complexType> </element> </schema>
<?xml version="1.0" encoding="UTF-8"?> <tns:classroom xmlns:tns="http://www.example.org/01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/01 01.xsd "> <tns:classname>一班</tns:classname> <tns:gradename>一年级</tns:gradename> <tns:students> <tns:student> <tns:code>00000011111</tns:code> <tns:name>傻逼</tns:name> <tns:age>12</tns:age> </tns:student> <tns:student> <tns:code>00000022222</tns:code> <tns:name>傻帽</tns:name> <tns:age>30</tns:age> </tns:student> </tns:students> </tns:classroom>