XML學習筆記(三)

一、Schema

1.一、什麼是Schema

Schema:原稱爲XSD(XML Schema Definition),是由微軟提出的規範,現成爲W3C規範
XML Schema是用一套內置的XML元素和屬性建立的,這些元素和屬性定義了XML文檔的結構和內容模式。
XML Schema規定XML文檔實例的結構和每一個元素/屬性的數據類型git

1.二、體驗dtd和schema的不一樣之處

首先建立一個xml文檔數據庫

<?xml version="1.0" encoding="UTF-8"?>
<student>
    <name>貂蟬</name>
    <age>20</age>
</student>

先使用內部的dtd對xml文檔作約束ide

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE student[
<!ELEMENT student (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
]>
<student>
    <name>貂蟬</name>
    <age>20</age>
</student>

那麼若是採用schema如何來編寫呢?ui

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="name" type="xs:string"></xs:element>
    <xs:element name="age" type="xs:int"></xs:element>
    <!--定義一個數據類型-->
    <xs:complexType name="stuType">
        <xs:sequence>
            <xs:element ref="name"></xs:element>
            <xs:element ref="age"></xs:element>
        </xs:sequence>
    </xs:complexType>
    <xs:element name="student" type="stuType"></xs:element>
</xs:schema>

編寫一個xml引用此schema編碼

<?xml version="1.0" encoding="UTF-8"?>
<student xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Users\Administrator\Desktop\demo\xsd01.xsd">
    <name>關羽</name>
    <age>20</age>
</student>

1.三、dtd與Schema的比較

dtd的語法的侷限性:spa

一、dtd使用的是一種語法,而xml使用的是另一種語法rest

二、dtd的數據類型是有限的,與咱們講的數據庫中數據類型不一致code

三、dtd不能夠擴展,而且不支持命令空間orm

Schema的好處:xml

一、Schema也是遵照xml的語法

二、schema大大擴充了數據類型,也能夠自定義本身的數據類型

三、它也支持元素的繼承,支持元素組合屬性組的概念

四、開發性,多個schema的聲明能夠應用到一個xml文檔中。

1.四、Schema文檔的結構

schema文檔的結構

mark

引用schema的文檔

mark

1.五、Schema中的數據類型(知道便可)

數據類型分類:

簡單類型

​ 內置的數據類型(built-in data types)

​ l基本的數據類型(Primitive Data Types)

​ l擴展的數據類型(Deriverd Data Types)

​ 用戶自定義數據類型(經過simpleType定義)

複雜類型(經過complexType定義)

基本數據類型

數據類型 描述
string 表示字符串
boolean 布爾型
decimal 表明特定精度的數字
float 表示單精度32位浮點數
double 表示雙精度64位浮點數
duration 表示持續時間
dateTime 表明特定的時間
time 表明特定的時間,可是是天天重複的
date 表明日期
hexBinary 表明十六進制數
anyURI 表明一個URI,用來定位文件
QName 表明限定(qualified)名稱,即有前綴的字符串

擴展的數據類型

數據類型 描述
ID 用於惟一標識元素
IDREF/ IDREFS 參考ID類型的元素或屬性
ENTITY/ENTITIES 實體類型
NMTOKEN NMTOKEN類型
NMTOKENS NMTOKEN類型集
long 表示整型數,大小介於-9223372036854775808 和9223372036854775807之間
int 表示整型數,大小介於-2147483648和 2147483647之間
short 表示整型數,大小介於-32768和32767之間
byte 表示整型數,大小介於-128和127之間
NOTATION 表明 NOTATION類型,QName的派生類型

其餘數據類型

數據類型 描述
gYear/gYearMonth 指定格式的日期
gMonth/gMonthDay 指定格式的日期
gDay 指定格式的日期
base64Binary 使用base64-encoded編碼的2進制數據
language 語言字符,string的派生
Name 有效的XML字符串,string的派生
NCName Name的派生,字符串中不容許「:」
negativeInteger 表示負整數,<= -1
positiveInteger 表示正整數,>=1
nonNegativeInteger >=0,另有nonPositiveInteger表示<=0
unsignedLong 無符號數,還有un…Int、Short、Byte

數據類型的約束

特性 描述
enumeration 在指定的數據集中選擇,限定用戶的選值
fractionDigits 限定最大的小數位,用於控制精度
length 指定數據的長度
maxExclusive / minExclusive 指定數據的最大/小值(小於/大於)
maxInclusive / minInclusive 指定數據的最大/小值(小於等於/大於等於)
maxLength / minLength 指定長度的最大/小值
pattern 指定數據的顯示規範,具體規則見下頁
whiteSpace 空白字符的處理:preserve/replace/collapse
precision 十進制數據容許的位數
scale 小數部分的位數

正則描述

規範 描述
\d 任意一個數字,如:Chap\dàChap一、Chap9……
* 前的字符任意重複,如:abàb、ab、aaaaab……
[ ] [ ]內的字符集中任意一個,如:[xyz]aàxa、ya、za
?前的字符出現0或1次
+ + 前的字符至少出現1次
- 指定範圍,如:[a-d]yàay、by、cy、dy
{n} { }前的字符出現n次,如:a{3}xàaaax
{min,max} { }前的字符至少出現min次,至多max次,如:a{1,3}xàax、aax、aaax

1.五、Schema中的元素類型

•schema、element、attribute、group、attributeGroup

•simpleType

•simpleContent

•complexType

1.5.一、element

案例:xsd02.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<!--定義元素-->
<xs:element name="name" type="xs:string"></xs:element>
<xs:element name="type" type="xs:string"></xs:element>
<!--定義是一個類型-->
<xs:complexType name="heroType">
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="name"></xs:element>
        <xs:element ref="type"></xs:element>
    </xs:sequence>
</xs:complexType>

<xs:element name="hero" type="heroType"></xs:element>
<!--定義了一個類型,這個類型中包含多個hero元素-->
<xs:complexType name="herosType">
    <xs:sequence maxOccurs="unbounded">
        <xs:element ref="hero"></xs:element>
    </xs:sequence>
</xs:complexType>

<xs:element name="heros" type="herosType"></xs:element>

</xs:schema>

xml文件引用

<?xml version="1.0" encoding="UTF-8"?>
<heros xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Users\Administrator\Desktop\demo\xsd02.xsd">
    <hero>
        <name>關羽</name>
        <type>戰士</type>
    </hero>
    <hero>
        <name>曹操</name>
        <type>戰士</type>
    </hero>
    <hero>
        <name>亞瑟</name>
        <type>戰士</type>
    </hero>
    <hero>
        <name>安其拉</name>
        <type>法師</type>
    </hero>
</heros>

1.5.二、group元素

把一組元素聲明組合在一塊兒,以便它們可以一塊兒被複合類型應用

案例,使用group組來進行改寫代碼

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<!--定義元素-->
<xs:element name="name" type="xs:string"></xs:element>
<xs:element name="type" type="xs:string"></xs:element>

<!--定義一個元素組-->
<xs:group name="myElGroup">
    <xs:sequence>
        <xs:element ref="name"></xs:element>
        <xs:element ref="type"></xs:element>
    </xs:sequence>
</xs:group>
<!--定義是一個類型-->
<xs:complexType name="heroType">
    <xs:group ref="myElGroup"></xs:group>
</xs:complexType>

<xs:element name="hero" type="heroType"></xs:element>
<!--定義了一個類型,這個類型中包含多個hero元素-->
<xs:complexType name="herosType">
    <xs:sequence maxOccurs="unbounded">
        <xs:element ref="hero"></xs:element>
    </xs:sequence>
</xs:complexType>

<xs:element name="heros" type="herosType"></xs:element>

</xs:schema>

實際上xml文件並不須要發生任何的改變

1.5.三、attribute和attributeGroup

案例1:直接定義屬性

<xs:complexType name="heroType">
    <xs:group ref="myElGroup"></xs:group>
    <xs:attribute name="age" type="xs:int" use="required"></xs:attribute>
    <xs:attribute name="birthday" type="xs:date" use="optional"></xs:attribute>
    <xs:attribute name="addr" type="xs:string" use="prohibited"></xs:attribute>
</xs:complexType>

而後咱們在使用attributeGroup來定義屬性組

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<!--定義元素-->
<xs:element name="name" type="xs:string"></xs:element>
<xs:element name="type" type="xs:string"></xs:element>

<!--定義一個元素組-->
<xs:group name="myElGroup">
    <xs:sequence>
        <xs:element ref="name"></xs:element>
        <xs:element ref="type"></xs:element>
    </xs:sequence>
</xs:group>
<xs:attributeGroup name="myAttrGroup">
    <xs:attribute name="age" type="xs:int" use="required"></xs:attribute>
    <xs:attribute name="birthday" type="xs:date" use="optional"></xs:attribute>
    <xs:attribute name="addr" type="xs:string" use="prohibited"></xs:attribute>
</xs:attributeGroup>
<!--定義是一個類型-->
<xs:complexType name="heroType">
    <xs:group ref="myElGroup"></xs:group>
    <xs:attributeGroup ref="myAttrGroup"></xs:attributeGroup>
</xs:complexType>

<xs:element name="hero" type="heroType"></xs:element>
<!--定義了一個類型,這個類型中包含多個hero元素-->
<xs:complexType name="herosType">
    <xs:sequence maxOccurs="unbounded">
        <xs:element ref="hero"></xs:element>
    </xs:sequence>
</xs:complexType>
<xs:element name="heros" type="herosType"></xs:element>
</xs:schema>

1.5.四、simpleType

•做用:定義一個簡單類型,它決定了元素和屬性值的約束和相關信息

•屬性:name

•內容:應用已經存在的簡單類型,三種方式:

restriction:限定一個範圍

list:從列表中選擇

union:包含一個值的結合

案例1:schema文件定義:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:simpleType name="myAge">
        <xs:restriction base="xs:int">
            <xs:minInclusive value="0"></xs:minInclusive>
            <xs:maxInclusive value="100"></xs:maxInclusive>
        </xs:restriction>
    </xs:simpleType>
    <xs:element name="sname" type="xs:string"></xs:element>
    <xs:element name="age" type="myAge"></xs:element>
    <xs:complexType name="stuType">
        <xs:sequence minOccurs="1" maxOccurs="unbounded">
            <xs:element ref="sname"></xs:element>
            <xs:element ref="age"></xs:element>
        </xs:sequence>
    </xs:complexType>

    <xs:element name="student" type="stuType">  
    </xs:element>
</xs:schema>

引用

<?xml version="1.0" encoding="UTF-8"?>
<student xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Users\Administrator\Desktop\demo\xsd03.xsd">
    <sname>貂蟬</sname>
    <!--此時age中內容必須符合myage的定義要求-->
    <age>100</age>
</student>

案例2:

<xs:simpleType name="mybirthday">
        <xs:list itemType="xs:date"></xs:list>
</xs:simpleType>

引用

<?xml version="1.0" encoding="UTF-8"?>
<student xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Users\Administrator\Desktop\demo\xsd03.xsd">
    <sname>貂蟬</sname>
    <!--此時age中內容必須符合myage的定義要求-->
    <age>100</age>
    <birthday>2012-01-22 2018-02-22</birthday>
</student>

案例3:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<!--定義了一個屬性-->
<xs:attribute name="allframesize">
  <xs:simpleType>
    <!--聯合-->
    <xs:union>
      <xs:simpleType>
        <xs:restriction base="roadbikesize"/>
      </xs:simpleType>
      <xs:simpleType>
        <xs:restriction base="mountainbikesize"/>
      </xs:simpleType>
    </xs:union>
  </xs:simpleType>
</xs:attribute>

<!--定義了一個simpleType類型-->
<xs:simpleType name="roadbikesize">
  <xs:restriction base="xs:positiveInteger">
    <xs:enumeration value="16"/>
    <xs:enumeration value="20"/>
    <xs:enumeration value="28"/>
  </xs:restriction>
</xs:simpleType>

<!--定義了一個simpleType類型-->
<xs:simpleType name="mountainbikesize">
  <xs:restriction base="xs:string">
    <xs:enumeration value="small"/>
    <xs:enumeration value="medium"/>
    <xs:enumeration value="large"/>
  </xs:restriction>
</xs:simpleType>

<xs:element name="name" type="xs:string"></xs:element>
<xs:complexType name="stuType">
    <xs:sequence minOccurs="1" maxOccurs="5">
        <xs:element ref="name"></xs:element>
    </xs:sequence>
    <xs:attribute ref="allframesize"></xs:attribute>
</xs:complexType>
<xs:element name="student" type="stuType"></xs:element>

</xs:schema>

引用文件

<?xml version="1.0" encoding="UTF-8"?>
<!--allframesize的值能夠是roadbikesize或者mountainbikesize-->
<student xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Users\Administrator\Desktop\demo\xsd04.xsd" allframesize="small">
    <name></name>
</student>

1.5.五、complexType和simpleContent元素

complexType:定義一個複合類型,它決定了一組元素和屬性值的約束和相關信息

simpleContent:應用於complexType,對它的內容進行約束和擴展。

案例:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:complexType name="stuType">

        <xs:simpleContent>
            <!--內容只能放小數-->
         <xs:extension base="xs:decimal">
             <!--stuType有一個屬性sizing-->
            <xs:attribute name="sizing" use="required">
                <!--屬性是基於simpleType類型的-->
                <xs:simpleType>
                 <xs:restriction base="xs:string">
                    <xs:enumeration value="US"/>
                    <xs:enumeration value="Euro"/>
                    <xs:enumeration value="UK"/>
                 </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
         </xs:extension>
        </xs:simpleContent>

    </xs:complexType>

    <xs:element name="student" type="stuType"></xs:element>
</xs:schema>

引用schema文件

<?xml version="1.0" encoding="UTF-8"?>
<student sizing="US" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Users\Administrator\Desktop\demo\xsd05.xsd">
    10.1
</student>

總結一下:

SimpleType:基於已有數據類型的擴展

ComplexType:定義一個複合類型

SimpleContent:對ComplexType的內容作限定,這個複合類型沒有子元素,只能存在文本或者屬性

相關文章
相關標籤/搜索