WebService學習筆記(二) - XML的dtd和schema

一 DTD簡單介紹

不解釋,參看w3cschool

xml代碼:

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT classroom (claName,grade,students)>
<!ATTLIST classroom id ID #REQUIRED>
<!ELEMENT claName (#PCDATA)>
<!ELEMENT grade (#PCDATA)>
<!ELEMENT students (student+)>
<!ELEMENT student (id,stuName,age)>
<!ELEMENT id (#PCDATA)>
<!ELEMENT stuName (#PCDATA)>
<!ELEMENT age (#PCDATA)>

xml代碼:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE classroom SYSTEM "classroom.dtd">
<classroom id="c1">
    <claName>10計算機應用技術</claName>
    <grade>2010</grade>
    <students>
        <student>
            <id>1</id>
            <stuName>zhangsan</stuName>
            <age>12</age>
        </student>
        <student>
            <id>2</id>
            <stuName>lisi</stuName>
            <age>122</age>
        </student>
    </students>
</classroom>

二 schema入門

schema出現的目的是通過一個更加合理的方式來編寫xml的限制文件(基於xml語法的方式),可以使用命名空間來支持多個名稱相同的元素防止命名衝突,可以很好的完成對java或者所有對象的修飾並且提供了大量的數據類型。

2.1 命名空間

xml代碼:

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
        targetNamespace="http://www.example.org/01"
        xmlns:tns="http://www.example.org/01" 
        elementFormDefault="qualified">
    <element name="user">
        <complexType>
            <sequence>
                <element name="id" type="int"/>
                <element name="username" type="string"/>
                <element name="born" type="date"/>
            </sequence>
        </complexType>
    </element>
</schema>

xmlns=”http://www.w3.org/2001/XMLSchema” : schema的默認名稱空間,不能修改,但是可以增加前綴,如果增加前綴之後就意味着所有的element等元素都需要增加前綴。
targetNamespace 自已這個文檔的命名空間,可以方便其它xml或者schema文件引用
xmlns:tns 此處的名稱和自己的名稱空間的名稱一致,但是增加了tns的前綴,此時如果要引用當前文件所創建的類型,需要加上tns前綴

在xml中引入schame

xml代碼:

<?xml version="1.0" encoding="UTF-8"?>
<user xmlns="http://www.example.org/01"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.example.org/01">
    <id>1</id>
    <username>zhangsan</username>
    <born>1989-12-22</born>
</user>

xmlns:xsi 創建了一個可以引入其它schema文件的命名空間
xsi:schemaLocation 引入其它命名空間, 如果要在eclipse中使用命名空間的引入,需要爲xml增加xml的cataloge

如果不希望通過命名空間來引入schema,可以使用文件路徑來引入

xml代碼:

xsi:noNamespaceSchemaLocation="01.xsd"

2.2 元素和屬性

sequence : 元素必須按順序出現

choice : 多個元素中選擇一個

all: 元素的出現順序可以爲任意,但相同的元素只能有一個

注意,屬性的定義在sequence之後。

xml代碼:

    <element name="books">
        <complexType>
        <!-- maxOccurs表示最大出現次數 -->
            <sequence maxOccurs="unbounded">
                <element name="book">
                    <complexType>
                        <sequence minOccurs="1" maxOccurs="unbounded">
                            <element name="title" type="string" />
                            <element name="content" type="string" />
                            <choice>
                                <element name="author" type="string" />
                                <element name="authors">
                                    <complexType>
                                        <all><!-- 每個元素只能出現一次 -->
                                            <element name="author" type="string"/>
                                        </all>
                                    </complexType>
                                </element>
                            </choice>
                        </sequence>
                        <attribute name="id" type="int" use="required"/>
                    </complexType>
                </element>
            </sequence>
        </complexType>
    </element>

2.3 相關約束

三 深入schema

3.1 數據模型的創建

通常一個類對一個schame文件,通過包含引用,需保證在同一個命名空間內

3.2 相關的設計方案

3.2.1 Russian Doll

只有一個根元素,通過嵌套的方式完成編寫
優點:結構清晰,根元素只有一個
缺點:元素無法重用

3.2.2 Salami Slice

優點:能夠進行最大化重用
缺點:根元素不清晰

xml代碼:

    <element name="book" type="tns:bookType"></element>
    <element name="id" type="int"/>
    <element name="title" type="string"/>
    <element name="content" type="string"/>


    <complexType name="bookType">
        <sequence>
            <element ref="tns:id"/>
            <element ref="tns:title"/>
            <element ref="tns:content"/>
        </sequence>
    </complexType>

3.2.3 Venetian Blind

一個根結點,通過simpleType完成重用。

xml代碼:

    <element name="person" type="tns:personType"/>

    <complexType name="personType">
        <sequence>
            <element name="name" type="string"/>
            <element name="age" type="tns:ageType"/>
            <element name="email" type="tns:emailType"/>
        </sequence>
        <attribute name="sex" type="tns:sexType"/>
    </complexType>

    <simpleType name="emailType">
        <restriction base="string">
            <pattern value="(\w+\.*)*\w+@\w+\.[A-Za-z]{2,6}"/>
            <minLength value="6"/>
            <maxLength value="255"/>
        </restriction>
    </simpleType>

    <simpleType name="ageType">
        <restriction base="int">
            <minInclusive value="1"/>
            <maxExclusive value="150"/>
        </restriction>
    </simpleType>

    <simpleType name="sexType">
        <restriction base="string">
            <enumeration value="男"/>
            <enumeration value="女"/>
        </restriction>
    </simpleType>

3.3 shema與java的轉換

使用xjc可以完成schema到java的轉換

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章