DTD和Schema

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>

猜你喜欢

转载自luan.iteye.com/blog/1755207