結合元素和屬性的定義分析Schema的幾種設計方案
Schema的幾種設計方案
1.Russian Doll 俄羅斯玩偶
只有一個根元素,通過巢狀的方式完成編寫
優點:結構清晰,根元素只有一個
缺點:元素無法重用
books.xsd
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/02"
xmlns:tns="http://www.example.org/02"
elementFormDefault="qualified">
<!--
元素的定義(元素及子元素)
屬性的定義,在sequence之後
Russian Doll
只有一個根元素,通過巢狀的方式完成編寫
優點:結構清晰,根元素只有一個
缺點:元素無法重用
-->
<element name="books">
<complexType>
<!-- sequence: 子元素按照順序出現 -->
<sequence maxOccurs="unbounded">
<element name="book">
<complexType>
<sequence minOccurs="1" maxOccurs="unbounded">
<element name="title" type="string" />
<element name="content" type="string" />
<!-- choice: 多個子元素中選擇一個 -->
<choice>
<element name="author" type="string" />
<element name="authors">
<complexType>
<!-- all: 子元素出現的順序任意,但每個子元素可出現零次或一次 -->
<all>
<element name="author" type="string" />
</all>
<!-- 如果有多個author,即author子元素出現多次,改用sequence標籤
<sequence maxOccurs="3">
<element name="author" type="string" />
</sequence> -->
</complexType>
</element>
</choice>
</sequence>
<!-- book元素的屬性,屬性的定義,在sequence之後 -->
<attribute name="id" type="int" use="required" />
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
對應的books_1.xml(注意在eclipse中引入對應的xml catalog)
<?xml version="1.0" encoding="UTF-8"?>
<book:books xmlns:book="http://www.example.org/02"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="02.xsd">
<book:book id="1">
<book:title>Java in action</book:title>
<book:content>java is good</book:content>
<book:author>Bruce</book:author>
</book:book>
<book:book id="2">
<book:title>SOA in action</book:title>
<book:content>soa is difficult</book:content>
<book:authors>
<book:author>Jack</book:author>
<book:author>Mike</book:author>
</book:authors>
</book:book>
</book:books>
因為引入books.xsd名稱空間的時候加了字首,xmlns:book=http://www.example.org/02,所以對於books.xsd中元素的引用都需要加入字首book。
2.Salami Slice 臘腸切片
優點:能夠進行最大化的重用
缺點:根元素不清晰
<?xml version="1.0" encoding="UTF-8"?>
<!--
Salami Slice
優點:能夠進行最大化的重用
缺點:根元素不清晰
-->
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/03"
xmlns:tns="http://www.example.org/03"
elementFormDefault="qualified">
<element name="book" type="tns:bookType" />
<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>
</schema>
3.Venetian Blind 百頁窗
一個根節點
通過simpleType完成重用
<?xml version="1.0" encoding="UTF-8"?>
<!--
Venetian Blind
一個根節點
通過simpleType完成重用
-->
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/04"
xmlns:tns="http://www.example.org/04"
elementFormDefault="qualified">
<element name="person" type="tns:personType" />
<!-- 複雜型別 -->
<complexType name="personType">
<sequence>
<element name="name" type="string" />
<element name="age" type="tns:ageType" />
<!-- 將sex定義為子元素 -->
<!--<element name="sex" type="tns:sexType" /> -->
<element name="email" type="tns:emailType" />
</sequence>
<!-- 將sex定義為屬性 -->
<attribute name="sex" type="tns:sexType" />
</complexType>
<!-- 簡單型別,通過對簡單型別的描述,完成重用。
(可定義不同的element,type為某個簡單型別,完成重用)-->
<simpleType name="ageType">
<restriction base="int">
<minInclusive value="1" />
<maxExclusive value="300" />
</restriction>
</simpleType>
<simpleType name="sexType">
<restriction base="string">
<enumeration value="男" />
<enumeration value="女" />
</restriction>
</simpleType>
<simpleType name="emailType">
<restriction base="string">
<pattern value="\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" />
<minLength value="6" />
<maxLength value="255" />
</restriction>
</simpleType>
</schema>
對應的person_1.xml
<?xml version="1.0" encoding="UTF-8"?>
<person xmlns="http://www.example.org/04"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/04"
sex="女">
<name>姚雙雙</name>
<age>25</age>
<email>yaoshuangg@163.com</email>
</person>
以上是schema的幾種設計方案,通常使用第三種方案,即Venetian Blind百頁窗式。
綜上,元素的定義採用<element>標籤;通過<complexType>定義子元素及子元素的順序、數量等;通過<simpleType>定義多種簡單型別,完成重用;屬性的定義在<sequence>之後(,<complexType>之中)。
相關文章
- Schema之簡單元素、複合元素和屬性
- jquery設定和獲取元素的屬性jQuery
- javascript實現的設定和獲取元素屬性JavaScript
- jQuery如何設定元素的屬性值jQuery
- 原生javascript如何設定元素的屬性JavaScript
- 設定和獲取元素固有屬性值
- 行內元素屬性設定
- jQuery建立一個元素同時設定元素的屬性jQuery
- 動態設定元素的disabled屬性可用和不可用
- left和right屬性也可以設定元素的寬度
- jquery設定元素css樣式的幾種方式jQueryCSS
- ts類中屬性定義的另一種方式
- DW屬性設定的總結 (轉)
- jQuery使用css()方法設定元素的display屬性值jQueryCSS
- Qt QTableWidget 設定列寬行高大小的幾種方式及其他常用屬性設定QT
- javascript學習之路之元素獲取和設定屬性JavaScript
- 定義物料型別的屬性型別
- 結構體和類中屬性定義需要static地方結構體
- javascript使用style方式如何設定和獲取元素的float浮動屬性JavaScript
- Python的tkinter獲取元件屬性和設定元件屬性Python元件
- jQuery動態建立html元素並設定屬性jQueryHTML
- Laravel ORM Model 的預定義屬性LaravelORM
- 物件導向:類的定義和繼承的幾種方式物件繼承
- XML Schema(XSD)詳解:定義 XML 文件結構合法性的完整指南XML
- css中span元素的width屬性無效果原因及多種解決方案CSS
- jQuery css()設定和獲取元素css屬性值程式碼例項jQueryCSS
- jQuery - 設定內容和屬性jQuery
- 在JSP中的JavaBean設定靜態屬性和方法有沒有意義?JSJavaBean
- 老生常談category增加屬性的幾種操作Go
- 多元統計分析02:多元正態分佈的定義和性質
- C/C++定義全域性變數/常量幾種方法的區別C++變數
- TypeScript 定義函式的幾種寫法TypeScript函式
- Xcode設定自己的個性屬性XCode
- CSS中常用的屬性設定CSS
- Gradle的屬性設定大全Gradle
- C#反射設定屬性值和獲取屬性值C#反射
- 原生js為元素繫結事件的幾種方式JS事件
- 介面服務中的冪等性設計和防重保證,詳細分析冪等性的幾種實現方法