一 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的轉換