xml约束
html中的标签是预定义的,就是因为html引入了约束
xml约束指通过编写一个文档来约束一个XML文档的书写规范(比如标签名称,标签顺序,文档结构等)
为什么需要xml约束?
为了保证数据的规范性和安全性。
xml的标签是自定义的,这样使用xml文档的程序就不能知道xml文档的真实结构,通常应用程序要求xml文件的结构是固定的,不同的程序要求自己使用的xml文档必须符合一定的规范
dtd约束
document Type Definition(缩写dtd),即文档类型定义
xml的引用dtd约束的方式有两种
- 内部dtd:在xml内部编写dtd
- 外部dtd:在外部文件中编写dtd,然后再引入到xml中
先看内部dtd
格式:
<!DOCTYPE 根元素 [元素声明]>
<?xml version="1.0"?>
<!DOCTYPE students [
<!ELEMENT student (name,age,sex,high)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ELEMENT high (#PCDATA)>
]>
<students>
<studnet>
<name>张三</name>
<age>18</age>
<sex>男</sex>
<high>身高175cm<high>
</studnet>
</students>
说明:!DOCTYPE students(第二行)定义根元素是students
!ELEMENT student (第三行)定义 student 元素有四个元素:name,age,sex,high,且顺序是固定的
!ELEMENT name (第四行)定义 name 元素为 "#PCDATA" 类型,本文类型,字符串
!ELEMENT age (第五行)定义 age 元素为 "#PCDATA" 类型
!ELEMENT sex (第六行)定义 sex 元素为 "#PCDATA" 类型
!ELEMENT high (第七行)定义 high 元素为 "#PCDATA" 类型
外部dtd,
创建dtd文件,后缀名是.dtd ,这里名为student.dtd
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT students (student+) >
<!ELEMENT student (name,age,sex,high)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ELEMENT high (#PCDATA)>
在xml文件中 引入外部dtd,分两种情况
示例
- 引入本地dtd文件:<!DOCTYPE students SYSTEM "student.dtd">
- 引入网络dtd文件:<!DOCTYPE students PUBLIC "名称空间" "student.dtd">
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE students SYSTEM "student.dtd">
<students>
<student>
<name> 张三</name>
<age>12</age>
<sex>男</sex>
<high>176cm</high>
</student>
</students>
但是dtd中的约束不严谨,更多地还是使用下面的schema约束
schema约束
XML Schema Definition,简称XSD
Schema是用一套预先定义好的XML元素和属性创建,规定了xml文档的结构和和每一个元素或属性的数据类型
schema约束更加严谨,克服了dtd约束的局限性,schema本身也是一个xml文件,但是文件名是以.xsd结尾.因为它的语法跟xml一样,所以应用更广泛
XML Schema:
- 定义可出现在文档中的元素
- 定义可出现在文档中的属性
- 定义哪个元素是子元素
- 定义子元素的次序和数目
- 定义元素是否为空,或者是否可包含文本
- 定义元素和属性的数据类型
- 定义元素和属性的默认值以及固定值
Schema中的简易元素:
简易元素指那些仅包含文本的元素。它不会包含任何其他的元素或属性
定义简易元素的语法:
<xs:element name="xxx" type="yyy"/>
yyy指元素的数据类型,XML Schema 拥有很多内建的数据类型。
最常用的类型:
xs:string
xs:decimal
xs:integer
xs:boolean
xs:date
xs:time
例如: <xs:element name="dog" type="xs:string"/>
对应的xml标签为<dog>小黄</dog>
简易元素可拥有指定的默认值或固定值
默认值:
<xs:element name="home" type="xs:string" default="beijing"/>
如果没有在此标签上填充,那么此标签默认值为beijing
固定值:
<xs:element name="home" type="xs:string" fixed="beijing"/>
无法给此标签添加文本,因为它有固定值beijing
复杂元素:
复合元素指包含其他元素及/或属性的 XML 元素。
四种类型的复合元素:这四种元素均可包含属性!
- 空元素
- 包含其他元素的元素
- 仅包含文本的元素
- 包含元素和文本的元素
复合元素的定义方式1:通过命名此元素,直接对此元素声明
<xs:element name="home">
<xs:complexType>
<xs:sequence>
<xs:element name="province" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
对应的xml标签为:
<home>
<province>河北</province>
<city>邯郸</city>
</home>
方式2 :复合元素可以使用 type 属性,该属性的作用是引用要使用的复合类型的名称:
<xs:element name="home" type="address"/>
<xs:complexType name="address">
<xs:sequence>
<xs:element name="province" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
</xs:sequence>
</xs:complexType>
对应的xml标签
<home>
<province>河北</province>
<city>邯郸</province>
</home>
先不介绍更多Schema内容
看下xml中的Schema引用
在eclipse中创建Dynamic Web Project工程,数目项目名称后,选择Dynamic web moudle version为2.5的时候,项目会自动生成一个xml文件,它的路径为:项目/WebContent/WEB-INF/web.xml ,内容如下
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID"
version="2.5">
<display-name>xml5</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
查看下web_2_5.xsd ,按住ctrl,指向http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd,等鼠标变成小手,选择 open链接with XML Schema Editer,等页面跳转后点左下角的source即可查看源码,贴出来部分源码
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://java.sun.com/xml/ns/javaee"
xmlns:javaee="http://java.sun.com/xml/ns/javaee"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
version="2.5">
<xsd:annotation>
<xsd:documentation>
@(#)web-app_2_5.xsds 1.62 05/08/06
</xsd:documentation>
</xsd:annotation>
xml schema 了解即可,如果要学着写,文末有参考链接,加油.
参考 w3cschool