XML學習筆記(三) -- Schema


標簽(空格分隔): 學習筆記


Schema的格式

XML Schema文檔是由元素、屬性、命名空間和XML文檔中的其他節點構成的。
XML Schema有兩種重要的Schema模型:Microsoft XML Schema和W3C XML Schema。

例:
1)新建一個schema文件film.xsd

<?xml version="1.0" encoding="GB2312"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="電影">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="片名" type="xsd:string"/>
                <xsd:element name="主演" type="xsd:string"/>
                <xsd:element name="發行情況">
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:element name="發行國家" type="xsd:string"/>
                            <xsd:element name="發行日期" type="xsd:string"/>
                            <xsd:element name="拷貝數量" type="xsd:string"/>
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

2)新建xml文件:film.xml

<?xml version="1.0" encoding="GB2312"?>
<電影 xmlns:xsi="http://wwww.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="film.xsd">
    <片名>鋼鐵俠3</片名>
    <主演>小羅伯特·唐尼</主演>
    <發行情況>
        <發行國家>美國</發行國家>
        <發行日期>2013</發行日期>
        <拷貝數量>1000</拷貝數量>
    </發行情況>
</電影>

在XML Schema的基本結構中,XML Schema文件的根元素必須是schema,schema元素有一個屬性xmlns,用於指定整個XML Schema位於http://www.w3.org/2001/XMLSchema名稱空間中,名稱空間的前綴是xsd。

schema根元素

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 ...<!--Schema的內容-->
</xsd:schema>
  • xsd:schema -- 表示這是Schema文檔的根元素;
  • xmlns是用來聲明名稱空間的專用關鍵詞,這里的名稱空間http://www.w3.org/2001/XMLSchema被映射到xsd前綴 (名稱空間的前綴可以使用任意的標識符,而不只局限於xsd)

element元素

XML Schema中的元素是利用element標識符來聲明的,語法格式為:

<element bstract|block|default|final|fixed|form|id|maxOccurs|minOccurs|name|nillable|ref|substitutionGroup|type>
<annotation |simplrType|complexType|unique|key|keyref>
</element>

例如:
<xsd:element name="經理" type="xsd:string" maxOccurs="unbounded"/>
<xsd:element name="員工" type="xsd:string" maxOccurs="unbounded"/>

默認值和固定值

<?xml version="1.0" encoding="GB2312"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="newname" type="xsd:string"/>
    <xsd:element name="type" type="xsd:string" default="sports"/>
    <xsd:element name="date" type="xsd:integer" default="20161011"/>
    <xsd:element name="count" type="xsd:integer" fixed="1"/>
</xsd:schema>

引用和代替元素

有時候,一個元素在XML文檔中的不同位置上出現多次,如果在描述其結構的Schema文檔中對於該元素的聲明重復定義的話,會造成書寫重復也不美觀。-- 可以用元素引用來解決這個問題。

<xsd:element name="元素名稱" ref="要引用的元素名稱">

例子:
*** 使用ref屬性實現元素的引用

  1. 新建一個schema文件film.xsd,聲明一個“artist”屬性,然后在“film”元素中進行引用:

    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="film">
    xsd:complexType
    xsd:sequence
    <xsd:element name="name" type="xsd:string"/>
    <xsd:element ref="artist"/>
    </xsd:sequence>
    </xsd:comlexType>
    </xsd:element>
    <xsd:element name="artist">
    xsd:complexType
    xsd:sequence
    xsd:choice
    <xsd:element name="starring" type="xsd:string"/>
    <xsd:element name="director" type="xsd:string"/>
    </xsd:choice>
    </xsd:sequence>
    </xsd:complexType>
    </xsd:element>
    </xsd:schema>

  2. 新建xml文件film.xml,並與film.xsd文件相關聯:

    鋼鐵俠3 小羅伯特·唐尼
  3. 注意:在上例中,使用了ref屬性引用了元素artist的聲明。

*** 使用ref屬性實現元素組的替換

  1. 新建一個schema文件film.xsd

    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="film">
    xsd:complexType
    xsd:sequence
    <xsd:element name="name" type="xsd:string"/>
    <xsd:element ref="director"/>
    </xsd:sequence>
    </xsd:complexType>
    </xsd:element>
    <xsd:element name="director" type="xsd:string"/>
    <xsd:element name="starring" type="xsd:string" sunstitutionGroup="director"/>
    </xsd:schema>

  • 解析:在聲明"starring"時,使用substitutionGroup元素與director元素相關聯,然后在film元素中使用ref元素進行引用。

2)新建一個xml文件film.xml

<?xml version="1.0" encoding="GB2312"?>
<film xmlns:xsi-http://www.w3.org/2001/XMLSchema-instance xsi:noNamespaceSchemaLocation="film.xsd">
    <name>鋼鐵俠3</name>
    <starring>小羅伯特·唐尼</starring>
</film>

Schema屬性聲明

<xsd:attribute name="屬性名" type="屬性類型"/>

Schema自定義數據類型

1)film.xsd

<?xml version="1.0" encoding="GB2312"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="電影">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="片名" type="xsd:string"/>
                <xsd:element name="主演" type="主演類型"/>
                <xsd:element name="發行情況">
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:element name="編號" type="xsd:integer"/>
                            <xsd:element name="發行時間" type="xsd:string"/>
                            <xsd:element name="發行國家" type="xsd:string"/>
                            <xsd:element name="拷貝數量" type="數量類型"/>
                        </xsd:sequence>
                    <xsd:complexType>
                </xsd:element>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
    <xsd:simpleType name="主演類型">
        <xsd:restriction base="xsd:string">
            <xsd:minLength value="6"/>
            <xsd:maxLength value="20"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="數量類型">
        <xsd:restriction base="xsd:integer">
            <xsd:minInclusive value="1"/>
            <xsd:maxInclusive value="10000"/>
        </xsd:restriction>
    </xsd:simpleType>
</xsd:schema>
  1. film.xml

    <電影 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="film.xsd">
    <片名>蝙蝠俠3</片名>
    <主演>小羅伯特·唐尼</主演>
    <發行情況>
    <編號>1589874</編號>
    <發行時間>2013</發行時間>
    <發行國家>美國</發行國家>
    <拷貝數量>5000</拷貝數量>
    </發行情況>
    </電影>

復雜類型:simpleContent 和 complexContent

復雜類型與簡單類型的根本區別是:復雜類型的內容中可以包含其他元素或屬性,而簡單類型既不能包含子元素,也不能帶有任何屬性。

simpleContent

simpleContent是在簡單類型的基礎上通過增加屬性派生而來的,成為擴展派生(extension).

<xsd:element name="元素名稱" type="元素類型">
<xsd:complexType name="類型名">
    <xsd:simpleContent>
        <xsd:extension base="簡單類型">
            <xsd:attribute name="屬性名1" type="屬性類型"/>
            <xsd:attribute name="屬性名2" type="屬性類型"/>
            ....
        </xsd:extension>
    </xsd:simpleContent>
</xsd:complexType>
</xsd:element>

complexContent

complexContent元素是指元素中包含子元素,且包含屬性的復雜元素。

<xsd:element="元素名稱" type="元素類型">
<xsd:compexType name="類型名">
    <xsd:complexContent>
        <xsd:restriction base="xsd:anyType">
            <!--子元素聲明-->
            <!--屬性聲明-->
        </xsd:restriction>
    </xsd:complexContent>
</xsd:complexType>
</xsd:element>

其中,一個complexType元素通常會包含多個子元素。XML Schema提供了4種分組結構來指示子元素的順序,他們是all, sequence, choice, group

  1. all分組:使用all定義的元素組,在組中所有的元素成員都可以出現一次或者根本不出現,而且元素能夠以任意順序出現。

    <xsd:all maxOccurs="0|1" minOccurs="0|1">

    </xsd:all>

  2. sequence分組:sequence分組要求分組序列中的每個成員在實例文檔中出現的順序與定義的順序相同。出現的次數由maxOccursminOccurs控制。

    xsd:sequence

    </xsd:sequence>

  3. choice分組:choice分組相當於DTD中的"|",當子元素組合到choice中是,這些元素中只有一個元素必須在實例文檔中出現,用於互斥的情況。

    <xsd:choice id="ID" maxOccurs="大於或等於0的整數|unbounded" minOccurs="大於或等於0的整數">

    </xsd:choice>

  4. group分組:group分組是將若干個元素聲明歸為一組,一以便將他們當做一個組並入復雜類型的定義。

    <xsd:group maxOccurs="大於或等於0的整數|unbounded" minOccurs="大於或等於0的整數" name="組名" ref="組名">

    </xsd:group>

例子:
1)sample.xsd

<?xml version="1.0" encoding="GB2312"?>
<xsd:schema xmlns="http://www.w3.org/2001/XMLSchema">
<xsd:element name="電影" type="演員"/>
    <xsd:complexType name="演員">
        <xsd:sequence>
            <xsd:group ref="主演"/>
            <xsd:element name="片名" type="類型"/>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="類型">
        <xsd:choice>
            <xsd:element name="中文" type="string"/>
            <xsd:element name="英文" type="string"/>
        </xsd:choice>
    </xsd:complexType>
    <xsd:group name="主演">
        <xsd:sequence>
            <xsd:element name="男主演" type="string"/>
            <xsd:element name="女主演" type="string"/>
        </xsd:sequence>
    </xsd:group>
</xsd:schema>

2)sample.xml

<?xml version="1.0" encoding="GB2312"?>
<電影 xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance>
    <男主演>小羅伯特·唐尼</男主演>
    <女主演>格溫妮絲·帕特洛</女主演>
    <片名>
        <中文>鋼鐵俠3</中文>
    </片名>
</電影>

Schema的名稱空間

名稱空間是XML Schema中的重要部分,他提供了一種避免元素命名沖突的方法。名稱空間的用途在於為XML中使用的名稱提供一個容器。

名稱空間的類型

XMLSchema中的名稱空間共有三種類型:目標名稱空間標准名稱空間默認名稱空間

<xsd:schema targetNamespace="http://www.itzcn.net/xml"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns="http://www.itzcn.net.xml">

名稱空間的引用

  1. 在XML Schema文檔中已經定義目標名稱空間

    <根元素名稱 xmlns="http://www.itzcn.net/xml"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.itzcn.net/xml/要關聯的文檔名稱.xsd" 屬性名="屬性值"
    />

  2. 在XML Schema文檔中沒有定義目標名稱空間
    如果在XML Schema中只使用了標准名稱空間http://www.w3.org/2001/XMLSchema,那就需要使用如下樣式來關聯XML文檔:

    <根元素名稱 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="要關聯的文檔名稱.xsd"
    屬性名="屬性值"
    />


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM