本文不是帶你走進XML Schema的世界,如果要學習XML Schema可以參考http://www.w3schools.com/schema/default.asp ,下面主要談一下我在使用Schema時遇到的問題^o^如果有不對的地方歡迎指正哈^o^
1、XML Schema不能通過某個屬性的具體值來決定是否顯示其它屬性或子節點。如下XML文檔,在Schema中將不能通過havaChild屬性來控制childrenNums屬性和<Child>子節點是否顯示,如果havaChild為false,則childrenNums屬性和<Child>子節點沒有意義,但在Schema定義的XML文檔中仍然可以出現,Schema不能通過驗證來避免這種情況的發生。
1
<?xml version="1.0"?>
2
<Persons>
3
<Person name="Ddpie" havaChild="true|false" childrenNums="2">
4
<Child>
5
<Name>Tony</Name>
6
<Age>12</Age>
7
</Child>
8
<Child>
9
<Name>Tom</Name>
10
<Age>15</Age>
11
</Child>
12
</Person>
13
</Persons>
14

2

3

4

5

6

7

8

9

10

11

12

13

14

2、XML Schema定義XML子節點的顯示方式有3種:
all:所有定義的子節點都可以顯示,注意這里用的是“可以”不是“必須”,你可以在具體的element中定義最小顯示次數minOccurs是否為0來決定該節點是不是“必須”顯示。但all這種顯示方式要求minOccurs和maxOccurs的值只能是0或者1,也就是說你想讓某個節點重復出現,在all中是無法實現的。
choice:所有定義的子節點只能選擇一個來進行顯示,可以重復顯示若干次,在minOccurs和maxOccurs中定義最小和最大顯示次數。
sequence:所有定義的子節點必須按Schema中定義的順序來進行顯示,每個節點可以重復若干次,在minOccurs和maxOccurs中定義最小和最大顯示次數。
由于Schema只有這三種子節點顯示方式,所以如果某個XML文檔要求某個節點<Person>的子節點<Child>和<Friend>不限制出現順序和顯示次數,在Schema中是無法定義的,如下XML文檔在Schema是無法定義的:
1
<?xml version="1.0"?>
2
<Persons>
3
<Person name="Ddpie">
4
<Child>
5
<Name>Tony</Name>
6
<Age>12</Age>
7
</Child>
8
<Friend>
9
<Name>Lucy</Name>
10
<Address>Beijing</Address>
11
</Friend>
12
<Child>
13
<Name>Tom</Name>
14
<Age>15</Age>
15
</Child>
16
<Friend>
17
<Name>Stephen</Name>
18
<Address>Shanghai</Address>
19
</Friend>
20
</Person>
21
</Persons>
22

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

同時XML Schema對正則表達式的支持也不夠完整,可能是W3C認為沒必要全部支持,下面兩點是它不支持的操作:
3、不支持不區分大小寫匹配,如常用的 (?i),如果你要定義個節點<Person havaChild="True|False"/>
1
<xsd:element name="Person">
2
<xsd:complexType>
3
<xsd:attribute name="havaChild" use="required">
4
<xsd:simpleType>
5
<xsd:restriction base="xsd:string">
6
<xsd:pattern value="True|False"/>
7
</xsd:restriction>
8
</xsd:simpleType>
9
</xsd:attribute>
10
</xsd:complexType>
11
</xsd:element>

2

3

4

5

6

7

8

9

10

11

但是當你這樣定義你的XML節點時<Person havaChild="true"/>就會出錯了,因為它只能區分大小寫識別所定義的字符串,假如你還需要支持<Person havaChild="tRue"/>、<Person havaChild="truE"/>呢?由于XML Schema不支持“不區分大小寫的字符串匹配”,所以只能這樣做了:
1
<xsd:element name="Person">
2
<xsd:complexType>
3
<xsd:attribute name="havaChild" use="required">
4
<xsd:simpleType>
5
<xsd:restriction base="xsd:string">
6
<xsd:pattern value="[tT][rR][uU][eE]|[fF][aA][lL][sS][eE]"/>
7
</xsd:restriction>
8
</xsd:simpleType>
9
</xsd:attribute>
10
</xsd:complexType>
11
</xsd:element>

2

3

4

5

6

7

8

9

10

11

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