Schema 本身就是xml文件,也是用来检验xml,但功能比dtd更强大:1数据类型粒度更细,Schema本身是由dtd文件验证
去查w3c出的schema文档!!最全!!!最权威!!
schema是.xsd文件,本身也是xml文件,符合xml格式
schema文件的根元素必须是<xs:schema>
schema文件被称为模式文档,遵循schema文件的xml称为实例文档
<xs:schema>元素来源于xs命名空间
<xs:schema xmlns:xs=“http;//www.w3.org/2001/XMLSchema” 固定的地址
命名空间是http;//www.w3.org/2001/XMLSchema 它的前缀名(别名)xs
schema命名空间:
利用命名空间,向xml里引入定义好的schema文档(文档定义的元素)
前缀名xs就是命名空间的别名,区分不同命名空间,前缀名可以用在属性上,代表该命名空间下的属性:前缀名:属性名
前缀名:元素名
1!!1schema文件定义好元素后,一定要将所有的元素绑定到url上面(=命名空间上),用targetNamespace绑定!
<xs:schema targetNamespace=“http;//www.s.com” 绑定到相应url
elementFormDefault=“qulified”全部元素绑定, “unqulified”只绑定定义的根元素element
!!2其他xml用这个schema定义的元素时,要引入url(命名空间),引入元素,就等于受这个schema约束,是在根元素内引入,假设根元素we
sss是前缀名随便取,根元素里的所有子元素都要加前缀sss, xmlns:sss用于声明标签we来自哪个命名空间后,才能用we
<sss:we xmlns:sss=“http;//www.s.com”>
<sss:you/>
</sss:we >
但url只是个虚的标识,xml根本找不到schema
<sss:we xmlns:sss=“http;//www.s.com” xsi:schemaLocation=” http;//www.s.com 空格 c:\aa.xsd”> 指定真正的schema地址,格式;url空格 schema地址。如果直接xsd和xml在同一目录: url 空格aa.xsd
<sss:you/>
</sss:we >
但还有问题:在xml里用任何标签都要声明来自哪个url(namspace),schemaLocation不在之前的url,还要从新声明
<sss:we xmlns:sss=“http;//www.s.com”
xmlns:xsi=“http;//www.w3.org/2001/XMLSchema-Instance”
xsi:schemaLocation=” http;//www.s.com c:\aa.xsd”> 指定真正的schema地址,格式;url 地址。如果直接xsd和xml在同一目录: url aa.xsd
<sss:you/>
</sss:we >
xmlns:xsi 不用再指定xsd文件位置了,因为xml解析引擎会自动找到schema文档!
2默认命名空间,就是直接写元素名,不再在元素前加前缀名!
<we xmlns=“http//:” 没有前缀
we标签里的子元素都不用写前缀名!
3XML文档里引入多个schema文档
< we xmlns=“http;//www.anomymous.com”
xmlns:sss=“http;//www.s.com”
xmlns:xsi=“http;//www.w3.org/2001/XMLSchema-Instance”
xsi:schemaLocation=” http;//www.anomymous.com http;//www.23543.com /aa.xsd xsd在网站上
http;//www.s.com c:\aa.xsd“>
< you sss:id=”adv”/> we 和you来自默认命名空间 属性id来自sss命名空间
</ we >
引入了三个chema,并在schemaLocation里指定了各自的位置,xsd文件可以来自网络
4不使用命名空间:很少用!!!
< we
xmlns:xsi=“http;//www.w3.org/2001/XMLSchema-Instance”
xsi:noNamespaceSchemaLocation=” c:\aa.xsd“>
< you />
</ we >
直接用xsd文件
1建立schema文件
用xmlpsy –new-xsd 新建schema文件
<?xml version=”1.0”?>
<xs:schema xmlns:xs=” http://www.w3.org/2001/XMLSchema” targetNamespace?question>
schema必须是根元素!命名空间名可以改,但一般不去改。url是固定的,去copy
schema里所有定义的元素和数据类型都来自于” http://www.w3.org/2001/XMLSchema”命名空间,怎么来自,不是只是个标识吗?question
我们只需在<xs:schema> </xs:schema>里面去定义格式元素或属性
2验证XML
建立用schema验证的XML文件
new-xml-schema-browser 选择已存在的xsd文件
3定义元素:
<xs:element name=“元素名” type=“元素类型”fixed=“迭代的” default=“”minOccurs=“1” maxOccurs=“3”>
放在<xs:schema>根元素内容内
fixed元素内容固定值 default缺省值
minOccurs=“1” maxOccurs=“3”该元素至少出现一次,最多出现3次
maxOccurs=“unbounded”无上限
使用:
4 schema的元素类型,即元素内的内容或属性值是什么数据
1基本数据类型:元素内容和属性值类型都可以用
date:<xs:element name=“kite” type=“xs:date””> kite标签内容只能是日期:2012-03-05
string 字符串:<xs:element name=“kite” type=“xs:string””>
使用:
<kite>hello</kite>
float 浮点数:<xs:element name=“kite” type=“xs:float” >
<xs:attribute name=”interest2” type=”xs:integer” use=”required”/>
2扩展数据类型“
type=“xs:ID” 多个同名元素其内容值必须是唯一
type=“xs:IDREF” 必须参照已经定义成ID类型元素的的内容值
type=“xs:ENTITY” 元素内容只能是实体
type=“xs:int” type=“xs:short” 元素内容是int
type=“xs:long” type=“xs:byte”
可能会定义很多<xs:element>,但到底哪个是根元素是由我们自己决定的,在写schema的时候就应该胸有成竹了
3复杂类型:complexType :定义元素的子元素和属性,还可以包含simpleContent用来定义元素文本内容!:complexType可以嵌套,complextype里的element还可以定义complextype
<xs:element name=“kite” type=“xs:date””>
<xs:complexType name=”myrtype” > 自定义复杂类型名为mytype
<xs:sequence> 定义元素顺序!,有且只出现一次
<xs:element ref=”kite”></xs:element> 可以引用前面已经定义好的元素
<xs:element name=“cat” type=“xs:string”> 也可以自己直接定义元素,但该元素只属于这个复杂类型!
</xs:sequence>
</xs:complexType>
//以上只是定义个元素类型,需要应用于元素之中
<xs:element name=”pet” type=”mytype”></xs:element>
这样相当于,< pet > </ pet >元素里包含了两个子元素kite 和 cat
但此时:kite元素和pet是并列定义,但kite又是pet子元素矛盾吗?除非识别出来kite被引用到pet的子类,就把kite忽略掉了,或者;xml是顺序解释,当解释到ref=”kite”时就把kite本身元素忽略了,只考虑类型了,就不在和后面的element元素并列了,相当于隐藏了!
复杂类型也可以直接定义在元素标签内,complexType不用加name,element不用加type属性!但这个complexType只属于此属性
<xs:sequence minOccurs=“1” maxOccurs=“2”>
minOccurs sequence内所有元素最少出现次数,maxOccurs sequence内所有元素最多出现次数,sequence=“unbunded”不限制上限
就算多个元素出现多次,但也必须按序列;kite cat kite cat ...的顺序出现 不是kite kite cat cat!!和dta的组合类型不同,刚好相反
5 group元素定义一组element ,用来放在complexType里
<xs:element name=”p1” ></xs:element>
<xs:element name=”p2” ></xs:element>
<xs:group name=”mygroup” >
<xs:sequence>
<xs:element ref=”kite”></xs:element>
<xs:element name=“cat” type=“xs:string”>
</xs:sequence>
</xs:group>
用在:
<xs:complexType name=”mytype” >
<xs:group ref=”mygroup”>
</xs:group>
</xs:complexType>
6元素的属性attribute为元素定义属性,可以直接作为元素的子元素,为该元素绑定属性 也可以放在complextype里,定义多个属性。元素要定义属性就要引入该complextype类型
<xs:attribute name=”interest” fixed=“迭代的” default=“”> 属性固定值和默认值
<xs:complexType name=”mytype” >
<xs:attribute name=”interest1” type=”xs:integer” use=”optional” /> 可有可无属性,默认
<xs:attribute name=”interest2” type=”xs:integer” use=”required”/> 必须有的属性
<xs:attribute name=”interest” ref=”interest” > 引用外面已经定义好的
</xs:complexType>
例子:
<xs:attribute name=”interest” >
<xs:complexType name=”mytype” >
//定义元素
<xs:sequence>
<xs:element name=”kite”></xs:element>
<xs:element name=“cat” type=“xs:string”>
</xs:sequence>
//定义元素属性
<xs:attribute name=”interest1” type=”xs:integer” use=”optional” /> 内部定义可有可无
<xs:attribute name=”interest” ref=”interest” > 引用外面已经定义好的
</xs:complexType>
用:
<xs:element name=”person” type=“mytype”></xs:element>
person元素包含子两个元素和两个属性
7属性组attributeGroup与group功能类似,将多个元素属性定义在一起attributeGroup用来定义多个属性,最后由complextype引用
<xs:attributeGroup name=”myGroup” >
<xs:attribute name/>
<xs:attribute name/>
<xs:attributeGroup >
用:
<xs:complexType name=”mytype” >
<xs:group ref=”mygroup”>
</xs:group> 怎么和之前的定义的元素拥在一起?question
</xs:complexType>
<xs:element name=”person” type=“mytype”></xs:element>
person元素包含一组两个属性
|