Xml Schema的用途
1. 定义一个Xml文档中都有什么元素
2. 定义一个Xml文档中都会有什么属性
3. 定义某个节点的都有什么样的子节点,可以有多少个子节点,子节点出现的顺序
4. 定义元素或者属性的数据类型
5. 定义元素或者属性的默认值或者固定值
Xml Schema的根元素:
<?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 表示数据类型等定义来自w3 targetNamespace="http://www.w3schools.com" 表示文档中要定义的元素来自什么命名空间 xmlns="http://www.w3schools.com"表示此文档的默认命名空间是什么 elementFormDefault="qualified"> 表示要求xml文档的每一个元素都要有命名空间指定
……定义主体部分……
如何定义一个简单元素
<xs:element 此处表示要定义一个元素 name=”color” 表示要定义元素的名称 type=”xs:string” 表示要定义元素的数据类型 default=”red” 表示定义元素的默认值 fixed=”red”/> 表示要定义元素的固定值,此元素只可以取“red”值 以上定义了一个简单元素,元素实例:<color>red</color>
如何定义一个属性
<xs:attribute name=”birthday” 表示要定义属性的名字 type=”xs:date” 表示要定义属性的数据类型 default=”2001-01-11” 表示要定义属性的默认值 fixed=”2001-01-11” 表示要定义属性的固定值 use=”required”/> 表示此属性是否是必须指定的, 即如果不指定就不符合Schema, 默认没有use=”required”属性表示属性可有可无
如何定义元素或者属性值的限制
1.最大值最小值限制
<xs:element name="age"> <xs:simpleType> <xs:restriction base="xs:integer"> <xs:minInclusive value="0"/> 大于等于0,<xs: minExclusive>表示最小值但是不包括指定值 <xs:maxInclusive value="120"/> 小于等于120,<xs: maxExclusive> </xs:restriction> </xs:simpleType> </xs:element>
2.枚举限制,指只能在指定的几个值中取值
<xs:element name="car" type="carType"/> <xs:simpleType name="carType"> <xs:restriction base="xs:string"> <xs:enumeration value="Audi"/> <xs:enumeration value="Golf"/> <xs:enumeration value="BMW"/> </xs:restriction> </xs:simpleType>
3.模式(pattern)限制 ,指字符串的格式必须满足制定的匹配模式
例子
说明
<xs:element name="letter"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="[a-z]"/> </xs:restriction> </xs:simpleType> </xs:element>
表示只能在小写字母中取一个值
<xs:element name="initials"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="[A-Z][A-Z][A-Z]"/> </xs:restriction> </xs:simpleType> </xs:element>
表示必须是三个大写字母
<xs:element name="initials"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="[a-zA-Z][a-zA-Z][a-zA-Z]"/> </xs:restriction> </xs:simpleType> </xs:element>
表示必须是三个字母,可以是大写或小写的
<xs:element name="choice"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="[xyz]"/> </xs:restriction> </xs:simpleType> </xs:element>
表示必须是xyz中的一个
<xs:element name="prodid"> <xs:simpleType> <xs:restriction base="xs:integer"> <xs:pattern value="[0-9][0-9][0-9][0-9][0-9]"/> </xs:restriction> </xs:simpleType> </xs:element>
表示数字的范围是0-99999
<xs:element name="letter"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="([a-z])*"/> </xs:restriction> </xs:simpleType> </xs:element>
表示必须是0或者多个小写字符组成的序列
<xs:element name="letter"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="([a-z][A-Z])+"/> </xs:restriction> </xs:simpleType> </xs:element>
表示必须是多个字母。
<xs:element name="gender"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="male|female"/> </xs:restriction> </xs:simpleType> </xs:element>
表示是male或者female中的一个
<xs:element name="password"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="[a-zA-Z0-9]{8}"/> </xs:restriction> </xs:simpleType> </xs:element>
表示必须是8个字母数字字符
4.字符串长度的限制
<xs:element name="password"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:length value="8"/> </xs:restriction> </xs:simpleType> </xs:element>
长度必须是8。
<xs:element name="password"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:minLength value="5"/> <xs:maxLength value="8"/> </xs:restriction> </xs:simpleType> </xs:element>
表示长度在5-8之间
6. 对于空白字符的限制
示例
说明
<xs:element name="address"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:whiteSpace value="preserve"/> </xs:restriction> </xs:simpleType> </xs:element>
保留原样,表示xml处理器不会移除或者替换任何空白字符
<xs:element name="address"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:whiteSpace value="replace"/> </xs:restriction> </xs:simpleType> </xs:element>
指回车,换行,Tab都会被替换成空格处理
<xs:element name="address"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:whiteSpace value="collapse"/> </xs:restriction> </xs:simpleType> </xs:element>
去掉多于一个空格,和html中处理方式相同
如何定义复杂类型
复杂类型是指定义元素中包含属性或者子元素的类型
1. 定义只包含子元素的复杂类型
<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>
2. 定义只包含属性的复杂类型
<xs:element name="product" type="prodtype"/> <xs:complexType name="prodtype"> <xs:attribute name="prodid" type="xs:positiveInteger"/> </xs:complexType>
3. 定义只包含内容的复杂类型
<xs:element name="shoesize" type="shoetype"/> <xs:complexType name="shoetype"> <xs:simpleContent> <xs:extension base="xs:integer"> <xs:attribute name="country" type="xs:string" /> </xs:extension> </xs:simpleContent> </xs:complexType>
4. 定义包含内容和子元素混合的复杂类型
<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>
以上定义对应的Xml
<letter> Dear Mr.<name>John Smith</name>. Your order <orderid>1032</orderid> will be shipped on <shipdate>2001-07-13</shipdate>. </letter>
5. 定义包含属性和子元素的复杂类型
使用指示器
在Xsd中的指示器包括
1. 顺序指示器
1) 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
指示子元素中可以出现一个或者另一个
<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
指示子元素必须按照顺序出现
<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>
2. 出现次数指示器minOccurs,maxOccurs
<xs:element name="person"> <xs:complexType> <xs:sequence> <xs:element name="full_name" type="xs:string"/> <xs:element name="child_name" type="xs:string" maxOccurs="10" minOccurs="0"/> </xs:sequence> </xs:complexType> </xs:element>
3. 组指示器(group Indicators)
用来定义相关的一组元素
<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>
用来定义一组相关的属性
<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>
Any关键字
表示可以有任意元素
<xs:element name="person"> <xs:complexType> <xs:sequence> <xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string"/> <xs:any minOccurs="0"/> </xs:sequence> </xs:complexType> </xs:element>
anyAttribute关键字
<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:anyAttribute/> </xs:complexType> </xs:element>
substitutionGroup关键字
表示某一个元素和另一个替代元素定义相同
<xs:element name="name" type="xs:string"/> <xs:element name="navn" substitutionGroup="name"/> <xs:complexType name="custinfo"> <xs:sequence> <xs:element ref="name"/> </xs:sequence> </xs:complexType><xs:element name="customer" type="custinfo"/> <xs:element name="kunde" substitutionGroup="customer"/>
文中的例子都来自w3school.
参考 及引用
PHP SDO XML 数据访问服务 Data Access Service
PHP Examples
w3cschool XSD 教程
win XSD工具
你可以打开 vs2015开发人员提示符 如果有安装的话
E:\vs>xsd Microsoft(R) Xml 架构/数据类型支持实用工具 [Microsoft (R) .NET Framework, Version 4.6.1055.0] Copyright (C) Microsoft Corporation. All rights reserved. xsd.exe - 从给定源生成架构或类文件的实用工具。 xsd.exe <schema>.xsd /classes|dataset [/e:] [/l:] [/n:] [/o:] [/s] [/uri:] xsd.exe <assembly>.dll|.exe [/outputdir:] [/type: [...]] xsd.exe <instance>.xml [/outputdir:] xsd.exe <schema>.xdr [/outputdir:] - 选项 - /classes 针对此架构生成类。缩写形式为“/c”。 /dataset 针对此架构生成子类 DataSet。缩写形式为“/d”。 /enableLinqDataSet 为提供的架构生成启用 LINQ 的子类数据集。缩写为“/eld”。 /element:<element> 架构中要处理的元素。缩写形式为“/e:”。 /fields 生成字段而非属性。缩写形式为“/f”。 /order 为所有粒子成员生成显式顺序标识符。 /enableDataBinding 在所有生成的类型上实现 INotifyPropertyChanged 接口, 以启用数据绑定。缩写形式为“/edb”。 /language:<language> 用于生成的代码的语言。请从“CS”、“VB”、“JS”、“VJS”、“CPP” 中选择,或者为实现 System.CodeDom.Compiler.CodeDomProvider 的类提供一个完全限定的名称。默认语言是“CS”(CSharp)。 缩写形式为“/l:”。 /namespace:<namespace> 生成的类文件的命名空间。默认命名空间 为全局命名空间。缩写形式为“/n:”。 /nologo 取消显示版权标志。 /out:<directoryName> 在其中创建文件的输出目录。默认 为当前目录。缩写形式为“/o:”。 /type:<type> 程序集中要为其生成架构的类型。可以提供多个 类型。如果没有提供类型,则为程序集中的所有 类型生成架构。缩写形式为“/t:”。 /uri:<uri> 架构中要处理的元素的 URI。缩写形式为“/u:”。 - 高级 - /parameters:<file> 从指定的 xml 文件读取命令行选项。缩写形式为“/p:”。 - 参数 - <schema>.xsd 包含要导入元素的架构的名称。 <assembly>.dll|exe 包含要为其生成架构的类型的程序集的名称。 <instance>.xml 要从中推断 xsd 架构的 xml 文件的名称。 <schema>.xdr 要转换为 xsd 的 xdr 架构的名称。 可以提供同一类型的多个文件参数。