XSD(Xml Schema Definiton)简介

XSD简介

一、前言

XSD是一门用以规定xml文件中某个元素(一般是搭配)的模型,用以规定一个xml文件中某个元素应该出现哪些字段,哪些字段需要出现几次等。XSD也是一门语言,下面从其数据结构和语法(指令)介绍。数据结构:基本数据结构、复合数据结构。指令:类型定义、元素定义分别介绍。最后介绍如何使用,需要搭配命名空间来使用,规定某个命名空间下的元素结构。

二、数据结构

xsd的数据类型包括简易元素和复杂元素。

2.1 简单类型

简单类型都是内置的基本数据类型,例如为字符串、数字、逻辑等

2.1.1 简单元素

简单元素即不含子元素,不含属性的元素,任何含有属性或子元素的类型都是复杂类型。其在xsd中的语法:

  • 语法
    
    xs:element>
    
    表示定义一个简易元素或者属性xxx,其类型为yyy。default和fixed只能二选一或者都不出现,default标识缺乏元素时,默认值为hello。fixed表示只可以为固定值(一般不用,可以固定了干脆写入代码)
  • 示例
     <xs:element name="date" type="xs:string">
    
    该段标签标示定义一个简易元素,元素标签必须为date, 元素类型是string。简易元素即该元素内部只包含纯文本类数据,而不包含子元素。另外简易元素的类型即基本数据类型,包括boolean、integer、decimal、string、date、time。即纯文本数据必须符合这些模式规定的文本,比如boolean,那么文本只能是true或者false,如果是integer那么文本必须是纯数字或者开头有正负号等等。
2.1.2 简单属性
  • 语法
    语法类似简单元素,只不过需要将element替换为attribute
2.1.3 内容限定

以上的定义中除了说明了类型的较为宽泛的类型规范,没有细致的固定元素或者属性的详细内容。可以利用restriction来限定。

<xs:element name="age">
  <xs:simpleType>
    <xs:restriction base="xs:integer">
      <xs:minInclusive value="0"/>
      <xs:maxInclusive value="120"/>
    xs:restriction>
  xs:simpleType>
xs:element>

语法解释:需要使用simpleType包围restriction标签,在restriction标签的属性中需要指明限定数据的基本类型, 而后restriction子元素中限定内容。具体的每种数据类型的限制不一致,具体参考w3s标准。

2.2 复杂类型

复杂数据类型一般是指复合数据类型,即其包含子元素,子元素可以是复杂数据类型,可以是简易数据类型。定义复杂元素的基础是定义复杂类型,类似于写代码中需要定义class。

2.2.1 定义复杂类型
  • 语法

    
    <xs:complexType name="SequencedType"> 
      <xs:sequence>
        <xs:element name="tag_name" type="any_type_name"/>
        ...
        <xs:element name="tag_name_1" type="any_type_name"/>
      xs:sequence>
    xs:complexType>
    
    
    <xs:complexType name="UnorderedType">
      <xs:all>
        <xs:element name="tag_3" type="any_type_name" minOccur="1"/> 
          ...
        <xs:element name="tag_4" type="any_type_name" maxOccur="10"/>
      xs:all>
    xs:complexType>
    
    
    <xs:complexType name="ChoiceType">
      <xs:anotation>
         注释内容,一般都是解释类型
      xs:anotation>
      <xs:choice>
        <xs:element name="tag_3" type="any_type_name"/>
        <xs:element name="tag_4" type="any_type_name"/>
      xs:choice>
    xs:complexType>
    
    
    
      <xs:complexType>
        <xs:all>
          <xs:element name="seq" type="SequencedType"/>
          <xs:element name="unorder" type="UnorderedType"/>
          <xs:element name="choice" type="ChoiceType"/>
        xs:all>
      xs:complexType>
    xs:element>
    

    定义复杂类型的语法中可以定义三种类型的复杂类型,一种是严格要求字段顺序的类型sequence,一种是不要求严格顺序的类型all,还有一种是要求字段二选一的choice,另外可以在属性中添加minOccur好maxOccur来限定字段出现的次数。这里定义的只是一种类型,类似于C++/JAVA中定义class一样,如果需要使用还需要定义实例。实例定义中是定义了一个复合元素,该元素中定义了一个匿名的复合类型(complexType没有name属性),在实例定义中的子元素定义展现了一种定义复合元素的另一种方式。在实际写xsd时,一般都是采取后者的方式。

    <xs:element name="tag_name" type="type_name">
    

    三、使用

    在写完xsd文件后,规范了一个xml的结构规范,但是如何使用这组规范。

    
    <root xmlns="http://your.uri.of.xmlns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://your.uri.of.xmlns uri_of_your_xsd">
    root>
    

    上例显示了如何使用xsd,在元素root中定义了一个默认命名空间"http://your.uri.of.xmlns",第二个命名空间xmlns:xsi是公认的命名空间。第三个是一个属性,属性的内容是key value,key是要使用xsd的命名空间,value是xsd的uri,key和value使用空格隔开。关于命名空间可以参靠xml的命名空间,默认命名空间就是标签默认属于的空间,一般没有名字,带有名字的命名空间是类似xmlns:namespace=“uri”,如果在一个标签的签名使用namespace:tag,则标识该标签属于命名空间namespace。

你可能感兴趣的:(xml)