XSD文件详解(以Maven为例)

什么是XSD

XML Schema 的作用是定义 XML 文档的合法构建模块,类似 DTD。
XML Schema 是基于 XML 的 DTD 替代者。
XML Schema 描述 XML 文档的结构。
XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD)。
XML Schema:

  1. 定义可出现在文档中的元素
  2. 定义可出现在文档中的属性
  3. 定义哪个元素是子元素
  4. 定义子元素的次序
  5. 定义子元素的数目
  6. 定义元素是否为空,或者是否可包含文本
  7. 定义元素和属性的数据类型
  8. 定义元素和属性的默认值以及固定值

Xml Schema的用途

  1. 定义一个Xml文档中都有什么元素
  2. 定义一个Xml文档中都会有什么属性
  3. 定义某个节点的都有什么样的子节点,可以有多少个子节点,子节点出现的顺序
  4. 定义元素或者属性的数据类型
  5. 定义元素或者属性的默认值或者固定值

根元素

schema 声明:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
elementFormDefault="qualified" 
targetNamespace="http://maven.apache.org/POM/4.0.0"
 xmlns="http://maven.apache.org/POM/4.0.0">
...
...
</xs:schema>

xmlns:xs=“http://www.w3.org/2001/XMLSchema” 表示元素和数据类型等定义来自w3,同时它还规定了来自命名空间 w3 的元素和数据类型应该使用前缀 xs:
targetNamespace=“http://maven.apache.org/POM/4.0.0” 显示被此 schema 定义的元素 来自命名空间
xmlns=“http://maven.apache.org/POM/4.0.0” 表示此文档的默认命名空间
elementFormDefault=“qualified” 任何 XML 实例文档所使用的且在此 schema 中声明过的元素必须被命名空间限定

在 XML 文档中引用 Schema
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
</project>

规定了默认命名空间的声明。此声明会告知 schema 验证器,在此 XML 文档中使用的所有元素都被声明于"http://maven.apache.org/POM/4.0.0" 这个命名空间。
schemaLocation 属性有两个值。第一个值是需要使用的命名空间。第二个值是供命名空间使用的 XML schema 的位置

XSD简易元素

  1. 简易元素定义
     <xs:element name="tag" minOccurs="0" type="xs:string" default="HEAD"/>
    
    name="tag"表示要定义元素的名称 ,type=”xs:string” 表示要定义元素的数据类型,default=”HEAD” 表示定义元素的默认值,minOccurs=“0” 表示XML文档中某个[元素节点] 是否可以不出现,默认值为1,表示必须出现。
    除此之外,简易元素还有几个属性,nillable:表示XML文档中某个[元素取值] 是否可以为空,默认值为false,表示不能为空,fixed: 表示要定义元素的固定值,此元素只可以取这些值
  2. 简易元素属性
    <xs:attribute name="combine.children" type="xs:string"/>
    name=”combine.children” 表示要定义属性的名字,type=”xs:string” 表示要定义属性的数据类型,
    除此之外,default=”2001-01-11” 表示要定义属性的默认值,fixed=”2001-01-11” 表示要定义属性的固定值,use=”required” 表示此属性是否是必须指定的,即如果不指定就不符合Schema,默认没有use=”required”属性表示属性可有可无
  3. 简易元素限定
    简易元素的限定主要有以下几种类型
限定描述
enumeration定义可接受值的一个列表
fractionDigits定义所允许的最大的小数位数。必须大于等于0。
length定义所允许的字符或者列表项目的精确数目。必须大于或等于0。
maxExclusive定义数值的上限。所允许的值必须小于此值。
maxInclusive定义数值的上限。所允许的值必须小于或等于此值。
maxLength定义所允许的字符或者列表项目的最大数目。必须大于或等于0。
minExclusive定义数值的下限。所允许的值必需大于此值。
minInclusive定义数值的下限。所允许的值必需大于或等于此值。
minLength定义所允许的字符或者列表项目的最小数目。必须大于或等于0。
pattern定义可接受的字符的精确序列。
totalDigits定义所允许的阿拉伯数字的精确位数。必须大于0。
whiteSpace定义空白字符(换行、回车、空格以及制表符)的处理方式。

最大最小值限定

<xs:element name="age">
	<xs:simpleType>
	  <xs:restriction base="xs:integer">
	    <xs:minInclusive value="0"/>   <xs: minInclusive>表示最小值,包括指定值
	    <xs:maxInclusive value="120"/>  <xs: maxInclusive>表示最大值,包括指定值
	  </xs:restriction>
	</xs:simpleType>
</xs:element> 

枚举限定

<xs:element name="car">
	<xs:simpleType>
	  <xs:restriction base="xs:string">
	    <xs:enumeration value="Audi"/>
	    <xs:enumeration value="Golf"/>
	    <xs:enumeration value="BMW"/>
	  </xs:restriction>
	</xs:simpleType>
</xs:element> 

模式约束

<xs:element name="letter">
	<xs:simpleType>
	  <xs:restriction base="xs:string">
	  
	    <xs:pattern value="[a-z]"/>  可接受的值只有小写字母 a - z 其中的一个
	    <xs:pattern value="[A-Z][A-Z][A-Z]"/> 可接受的值是大写字母 A - Z 其中的三个
	    <xs:pattern value="[a-zA-Z][a-zA-Z][a-zA-Z]"/>可接受的值是大写或小写字母 a - z 其中的三个
	    <xs:pattern value="[xyz]"/> 可接受的值是字母 x, y 或 z 中的一个
	    <xs:pattern value="[0-9][0-9][0-9][0-9][0-9]"/> 可接受的值是五个阿拉伯数字的一个序列,且每个数字的范围是 0-9
	    <xs:pattern value="([a-z])*"/> 可接受的值是 a - z 中零个或多个字母
	    <xs:pattern value="([a-z][A-Z])+"/> 可接受的值是一对或多对字母,每对字母由一个小写字母后跟一个大写字母组成
	    <xs:pattern value="male|female"/> 可接受的值是 male 或者 female
	    <xs:pattern value="[a-zA-Z0-9]{8}"/> 可接受的值是由 8 个字符组成的一行字符,这些字符必须是大写或小写字母 a - z 亦或数字 0 - 9
	    
	  </xs:restriction>
	</xs:simpleType>
</xs:element> 

空白字符限定

<xs:element name="address">
	<xs:simpleType>
	  <xs:restriction base="xs:string">
	    <xs:whiteSpace value="preserve"/>  whiteSpace 限定被设置为 "preserve",这意味着 XML 处理器不会移除任何空白字符
	    <xs:whiteSpace value="replace"/> whiteSpace 限定被设置为 "replace",这意味着 XML 处理器将替换所有空白字符(换行、回车、空格以及制表符)
	    <xs:whiteSpace value="collapse"/>whiteSpace 限定被设置为 "collapse",这意味着 XML 处理器将移除所有空白字符(换行、回车、空格以及制表符会被替换为空格,开头和结尾的空格会被移除,而多个连续的空格会被缩减为一个单一的空格)
	  </xs:restriction>
	</xs:simpleType>
</xs:element> 

长度限定

<xs:element name="password">
	<xs:simpleType>
	  <xs:restriction base="xs:string">
	  	<xs:length value="8"/> 值必须精确到 8 个字符
	    <xs:minLength value="5"/> 值最小为 5 个字符
	    <xs:maxLength value="8"/> 最大为 8 个字符
	  </xs:restriction>
	</xs:simpleType>
</xs:element> 

XSD复合类型

定义复合元素有两种方法
1、 通过命名此元素,可直接对元素进行声明

      <xs:element name="dependencies" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="dependency" minOccurs="0" maxOccurs="unbounded" type="Dependency"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>

2、元素可以使用 type 属性,这个属性的作用是引用要使用的复合类型的名称

      <xs:element name="dependencyManagement" minOccurs="0" type="DependencyManagement">
	      </xs:element>
  <xs:complexType name="DependencyManagement">	
	    <xs:all>
	      <xs:element name="dependencies" minOccurs="0">
	        <xs:complexType>
	          <xs:sequence>
	            <xs:element name="dependency" minOccurs="0" maxOccurs="unbounded" type="Dependency"/>
	          </xs:sequence>
	        </xs:complexType>
	      </xs:element>
	    </xs:all>
	  </xs:complexType>
  1. 空元素

          <xs:element name="configuration" minOccurs="0">
            <xs:complexType>
              <xs:attribute name="combine.children" type="xs:string"/>
              <xs:attribute name="combine.self" type="xs:string"/>
            </xs:complexType>
          </xs:element>
    
  2. 仅含元素
    <xs:sequence>。它意味着被定义的元素必须按上面的次序出现在元素中

          <xs:element name="dependencies" minOccurs="0">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="dependency" minOccurs="0" maxOccurs="unbounded" type="Dependency"/>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
    
  3. 仅含文本
    此类型仅包含简易的内容(文本和属性),因此我们要向此内容添加 simpleContent 元素。当使用简易内容时,我们就必须在 simpleContent 元素内定义扩展或限定,就像这样:

    <xs:element name="shoesize">
      <xs:complexType>
        <xs:simpleContent>
          <xs:extension base="xs:integer">
            <xs:attribute name="country" type="xs:string" />
          </xs:extension>
        </xs:simpleContent>
      </xs:complexType>
    </xs:element>
    
  4. 混合元素
    为了使字符数据可以出现在 “letter” 的子元素之间,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>
    

指示器

通过指示器,我们可以控制在文档中使用元素的方式。在XSD中有七种指示器:
Order 指示器:All,Choice,Sequence ;用于定义元素的顺序
Occurrence 指示器:maxOccurs,minOccurs;Occurrence 指示器用于定义某个元素出现的频率。maxOccurs 以及 minOccurs 的默认值均为 1。
Group 指示器:Group name, attributeGroup name;Group 指示器用于定义相关的数批元素。

  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 指示器
    指示器可规定某个元素可出现的最大次数,如需使某个元素的出现次数不受限制,请使用 maxOccurs=“unbounded” 这个声明
    <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"/>
        </xs:sequence>
      </xs:complexType>
    </xs:element>
    
  5. minOccurs 指示器
    指示器可规定某个元素能够出现的最小次数:
    <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>
    
  6. 元素组指示器
    用来定义相关的一组元素。
    <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>
    
  7. 属性组指示器
    用来定义相关的一组属性。
    <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元素

通过使用 <any> 元素,我们可以通过任何元素(在 <lastname> 之后)扩展 “person” 的内容

<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元素

元素使我们有能力通过未被 schema 规定的属性来扩展 XML 文档!

<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"/>

XSD数据类型

1、XSD字符串
字符串数据类型用于可包含字符串的值,可包含字符、换行、回车以及制表符。
可与字符串数据类型一同使用的限定:enumeration、length、maxLength、minLength、pattern (NMTOKENS、IDREFS 以及 ENTITIES 无法使用此约束)、whiteSpace

名称描述
ENTITIES
ENTITY
ID在 XML 中提交 ID 属性的字符串 (仅与 schema 属性一同使用)
IDREF在 XML 中提交 IDREF 属性的字符串(仅与 schema 属性一同使用)
IDREFSlanguage 包含合法的语言 id 的字符串
Name包含合法 XML 名称的字符串
NCName
NMTOKEN在 XML 中提交 NMTOKEN 属性的字符串 (仅与 schema 属性一同使用)
NMTOKENS
normalizedString不包含换行符、回车或制表符的字符串
QName
string字符串
token不包含换行符、回车或制表符、开头或结尾空格或者多个连续空格的字符串

2、日期和时间类型

名称描述
date定义一个日期值
dateTime定义一个日期和时间值
duration定义一个时间间隔
gDay定义日期的一个部分 - 天 (DD)
gMonth定义日期的一个部分 - 月 (MM)
gMonthDay定义日期的一个部分 - 月和天 (MM-DD)
gYear定义日期的一个部分 - 年 (YYYY)
gYearMonth定义日期的一个部分 - 年和月 (YYYY-MM)
time定义一个时间值

3、数值数据类型
可与数值数据类型一同使用的限定:enumeration、fractionDigits、maxExclusive、maxInclusive、minExclusive、minInclusive、pattern、totalDigits、whiteSpace

名字秒数
byte有正负的 8 位整数
decimal十进制数
int有正负的 32 位整数
integer整数值
long有正负的 64 位整数
negativeInteger仅包含负值的整数 ( …, -2, -1.)
nonNegativeInteger仅包含非负值的整数 (0, 1, 2, …)
nonPositiveInteger仅包含非正值的整数 (…, -2, -1, 0)
positiveInteger仅包含正值的整数 (1, 2, …)
short有正负的 16 位整数
unsignedLong无正负的 64 位整数
unsignedInt无正负的 32 位整数
unsignedShort无正负的 16 位整数
unsignedByte无正负的 8 位整数

4、杂项数据类型
可与杂项数据类型一同使用的限定:enumeration (布尔数据类型无法使用此约束*)、length (布尔数据类型无法使用此约束)、maxLength (布尔数据类型无法使用此约束)、minLength (布尔数据类型无法使用此约束)、pattern、whiteSpace

名称描述
anyURI
base64Binary
boolean
double
float
hexBinary
NOTATION
QName
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值