本文不是帶你走進(jìn)XML Schema的世界,如果要學(xué)習(xí)XML Schema可以參考http://www.w3schools.com/schema/default.asp ,下面主要談一下我在使用Schema時(shí)遇到的問(wèn)題^o^如果有不對(duì)的地方歡迎指正哈^o^
1、XML Schema不能通過(guò)某個(gè)屬性的具體值來(lái)決定是否顯示其它屬性或子節(jié)點(diǎn)。如下XML文檔,在Schema中將不能通過(guò)havaChild屬性來(lái)控制childrenNums屬性和<Child>子節(jié)點(diǎn)是否顯示,如果havaChild為false,則childrenNums屬性和<Child>子節(jié)點(diǎn)沒有意義,但在Schema定義的XML文檔中仍然可以出現(xiàn),Schema不能通過(guò)驗(yàn)證來(lái)避免這種情況的發(fā)生。

2

3

4

5

6

7

8

9

10

11

12

13

14

2、XML Schema定義XML子節(jié)點(diǎn)的顯示方式有3種:
all:所有定義的子節(jié)點(diǎn)都可以顯示,注意這里用的是“可以”不是“必須”,你可以在具體的element中定義最小顯示次數(shù)minOccurs是否為0來(lái)決定該節(jié)點(diǎn)是不是“必須”顯示。但all這種顯示方式要求minOccurs和maxOccurs的值只能是0或者1,也就是說(shuō)你想讓某個(gè)節(jié)點(diǎn)重復(fù)出現(xiàn),在all中是無(wú)法實(shí)現(xiàn)的。
choice:所有定義的子節(jié)點(diǎn)只能選擇一個(gè)來(lái)進(jìn)行顯示,可以重復(fù)顯示若干次,在minOccurs和maxOccurs中定義最小和最大顯示次數(shù)。
sequence:所有定義的子節(jié)點(diǎn)必須按Schema中定義的順序來(lái)進(jìn)行顯示,每個(gè)節(jié)點(diǎn)可以重復(fù)若干次,在minOccurs和maxOccurs中定義最小和最大顯示次數(shù)。
由于Schema只有這三種子節(jié)點(diǎn)顯示方式,所以如果某個(gè)XML文檔要求某個(gè)節(jié)點(diǎn)<Person>的子節(jié)點(diǎn)<Child>和<Friend>不限制出現(xiàn)順序和顯示次數(shù),在Schema中是無(wú)法定義的,如下XML文檔在Schema是無(wú)法定義的:

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

同時(shí)XML Schema對(duì)正則表達(dá)式的支持也不夠完整,可能是W3C認(rèn)為沒必要全部支持,下面兩點(diǎn)是它不支持的操作:
3、不支持不區(qū)分大小寫匹配,如常用的 (?i),如果你要定義個(gè)節(jié)點(diǎn)<Person havaChild="True|False"/>

2

3

4

5

6

7

8

9

10

11

但是當(dāng)你這樣定義你的XML節(jié)點(diǎn)時(shí)<Person havaChild="true"/>就會(huì)出錯(cuò)了,因?yàn)樗荒?strong>區(qū)分大小寫識(shí)別所定義的字符串,假如你還需要支持<Person havaChild="tRue"/>、<Person havaChild="truE"/>呢?由于XML Schema不支持“不區(qū)分大小寫的字符串匹配”,所以只能這樣做了:

2

3

4

5

6

7

8

9

10

11

4、不支持單詞邊界匹配,如常用的 \b和\B,所以如果需要匹配單詞邊界的話,只能在所要匹配的單詞后面加上\s了,呵呵,沒辦法^o^