1 . XML 與 DTD —— XML 入門(mén)知識(shí)
1.1 為什么要學(xué)習(xí)xml
XML 發(fā)展的非常迅速,這實(shí)在令人感到驚奇,有很多的軟件開(kāi)發(fā)商都采用了 XML 標(biāo)準(zhǔn)。我們相信,在未來(lái)的 Web 開(kāi)發(fā)中, XML 將和 HTML 一樣受到重視,他們都是 Web 技術(shù)的基礎(chǔ)。就連無(wú)線標(biāo)記語(yǔ)言 (WML , The Wireless Markup Language ), [ 用于標(biāo)識(shí)運(yùn)行于手持設(shè)備上(比如:手機(jī))的 Internet 程序 ] , WML 都采用了 XML 的標(biāo)準(zhǔn)。 XML 將成為最普遍的數(shù)據(jù)操縱和數(shù)據(jù)傳輸?shù)墓ぞ摺?/span>
1.2 什么是XML
XML 是 EXtensible Markup Language 的縮寫(xiě)。
XML 使用文檔類(lèi)型定義( DTD )或者模式( Schema )來(lái)描述數(shù)據(jù) 。
XML 使用 DTD 或者 Schema 后就是自描述的語(yǔ)言 。
1.3 XML 和HTML的主要區(qū)別
XML 是被設(shè)計(jì)用來(lái)描述數(shù)據(jù)的,重點(diǎn)是:什么是數(shù)據(jù),如何存放數(shù)據(jù)。
HTML 是被設(shè)計(jì)用來(lái)顯示數(shù)據(jù)的,重點(diǎn)是:顯示數(shù)據(jù)以及如何顯示數(shù)據(jù)更好上面。
他們?cè)诟袷缴弦泊嬖诰薮髤^(qū)別,相對(duì)講 xml 格式要求嚴(yán)格:
a. 所有的 XML 文檔必須有一個(gè)結(jié)束標(biāo)記
開(kāi)始標(biāo)簽和結(jié)束標(biāo)簽必須配套,也就是必須寫(xiě)成 <p></p> 或者 <high></ high > 。
b. 空元素必須關(guān)閉
不允許出現(xiàn)單標(biāo)簽,但標(biāo)簽必須關(guān)閉,關(guān)閉使用 <p/> 或者 <high/> 。
c. 所有標(biāo)簽都區(qū)分大小寫(xiě)
d. 所有標(biāo)簽都必須合理嵌套
層次合理比如 <p><high></high></p> 這樣就合理。
e. 所有標(biāo)簽的屬性值必須使用雙引號(hào) (””) 或者但引號(hào)括起來(lái)
f. xml 只能有一個(gè)根元素
1.4 XML 文檔組成
xml 文檔在邏輯上主要有以下 5 個(gè)部分組成:
1.xml 聲明
xml 文檔總是以一個(gè) xml 聲明開(kāi)始,其中指明所用的 xml 版本、文檔的編碼、文檔的獨(dú)立性信息。格式為:
<?xml version=”
其中需要注意的是在問(wèn)號(hào)左右兩邊不能有空格。
還有其默認(rèn)編碼是 utf8
yes 表示文檔是獨(dú)立文檔,即不依賴于外部文檔。
2. 文檔類(lèi)型聲明
我們可以用 DTD ( Document Type Definition 文檔類(lèi)型定義)來(lái)規(guī)范 xml 文檔中元素和屬性的規(guī)則及相互關(guān)系。
XML 從 SGML ( Standard Generalized Markup Language,SGML 標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言)繼承了用于定義語(yǔ)法規(guī)則的 DTD 機(jī)制。幾乎所有的 xml 應(yīng)用都是使用 DTD 來(lái)定義的。 DTD 文件也是一個(gè)文本文件,通常用 ”.dtd” 作為其擴(kuò)展名。
通過(guò)文檔類(lèi)型聲明,指出 xml 文檔所用的 DTD 。文檔類(lèi)型聲明有兩種形式,一種是聲明 DTD 在一個(gè)外部文件中,例如:
<!DOCTYPE greeting SYSTEM “hello.dtd”>
另 1 種是直接在 xml 給出 dtd ,例如:
<!DOCTYPE greeting [
<!ELEMENT greeting (#PCDATA)>
]>
3. 元素
XML 元素命名必須遵守下面的規(guī)則:
元素的名字可以包含子母,數(shù)字和其他字符。
元素的名字不能以數(shù)字或者標(biāo)點(diǎn)符號(hào)開(kāi)頭。
元素的名字不能以 XML( 或者 xml , Xml,xMl...) 開(kāi)頭。
元素的名字不能包含空格。
盡量不用冒號(hào),冒號(hào)在名稱(chēng)空間中用于分隔名稱(chēng)空間前綴和本地部分。
有 2 個(gè)細(xì)節(jié):
1. CDATA 段
CDATA 段中包含的都是純字符數(shù)據(jù),在字符數(shù)據(jù)可以出現(xiàn)的任何地方都可以使用 CDATA 段。 CDATA 段主要用于需要將整個(gè)文本解釋為字符數(shù)據(jù)而不是標(biāo)記的情況下。
CDATA 段以字符串 ”<![CDATA[ ” 開(kāi)始, ”]]>” 結(jié)束。
2. 字符引用和預(yù)定義實(shí)體引用
xml 有 5 個(gè)特殊字符,小于 < 、大于 > 、雙引號(hào) ” 、單引號(hào) ’ 、和號(hào) & 。在數(shù)據(jù)中需要使用這幾個(gè)字符時(shí)候可以用通用字符引用和預(yù)定義引用:
請(qǐng)參考:表 1-1 特殊字符的字符引用和預(yù)定義實(shí)體引用
字符 |
字符引用 10 進(jìn)制 |
字符引用 16 進(jìn)制 |
預(yù)定義實(shí)體引用 |
< |
< |
|
< |
> |
> |
> |
> |
“ |
" |
" |
" |
‘ |
' |
' |
' |
& |
& |
& |
& |
4. 注釋
在 XML 中注釋的語(yǔ)法基本上和 HTML 中的一樣。 <!-- 這是一個(gè)注釋 --> 。注釋不要出現(xiàn)在標(biāo)記中。
5. 處理指令
處理指令允許文檔中包含由應(yīng)用程序來(lái)處理的指令。處理指令的語(yǔ)法和 xml 聲明類(lèi)似,以 < ?開(kāi)始,以 ?> 結(jié)束。一個(gè)常見(jiàn)的樣式表單的處理指令如下所示:
<?xml–stylesheet href=”hello.css” type=”text/css”?>
1.5 關(guān)于DTD
符合語(yǔ)法的 XML 文檔稱(chēng)為結(jié)構(gòu)良好的 XML 文檔。
通過(guò) DTD 驗(yàn)證的 XML 文檔稱(chēng)為有效的 XML 文檔。
XML Schema(XML 模式 ) 是基于 XML 的 DTD 的替代品。
通過(guò) DTD ,你的每一個(gè) XML 文件都自身攜帶有關(guān)它自身格式的說(shuō)明。
通過(guò) DTD ,不同群體的人們可以對(duì)使用普通的 DTD 來(lái)交換數(shù)據(jù)的方法達(dá)成一致。
含有 DTD 的實(shí)例 XML 文件:
#PCDATA 指明必須是字符數(shù)據(jù)。
2 <!DOCTYPE note [
3 <!ELEMENT note (to,from,heading,body)>
4 <!ELEMENT to (#PCDATA)>
5 <!ELEMENT from (#PCDATA)>
6 <!ELEMENT heading (#PCDATA)>
7 <!ELEMENT body (#PCDATA)>
8 ]>
9 <note>
10 <to>Tove</to>
11 <from>Jani</from>
12 <heading>Reminder</heading>
13 <body>Don't forget me this weekend</body>
14 </note>
15
如果 DTD 對(duì)于你的 XML 文件是外部而言,那么它會(huì)在含有以下句法構(gòu)造的 DOCTYPE 聲明中預(yù)先包裝進(jìn)去。如:
2 <!DOCTYPE note SYSTEM "note.dtd">
3 <note>
4 <to>Tove</to>
5 <from>Jani</from>
6 <heading>Reminder</heading>
7 <body>Don't forget me this weekend!</body>
8 </note>
下面是一份包含了 DTD 的 "note.dtd" 文件副本:
2 <! ELEMENT to (#PCDATA) >
3 <! ELEMENT from (#PCDATA) >
4 <! ELEMENT heading (#PCDATA) >
5 <! ELEMENT body (#PCDATA) >
1.6 XSL
XSL (全稱(chēng)是:可擴(kuò)展的樣式單語(yǔ)言,the eXtensible Stylesheet Language)比CSS樣式單功能要強(qiáng)大的多。XSL的一個(gè)主要的用途就是將XML文檔轉(zhuǎn)換成HTML格式的文件,然后再交付給瀏覽器,由瀏覽器顯示轉(zhuǎn)換的結(jié)果。是XML的可擴(kuò)展樣式單語(yǔ)言。
1.7 XML 數(shù)據(jù)島
在 HTML 頁(yè)面中嵌入 XML 數(shù)據(jù)
使用非官方標(biāo)準(zhǔn)的 <xml> 標(biāo)記可以將 XML 數(shù)據(jù)嵌入到 HTML 頁(yè)面中。
XML 數(shù)據(jù)可以象下面的例子那樣嵌入 HTML 頁(yè)面 :
2 <note>
3 <to>Tove</to>
4 <from>Jani</from>
5 <heading>Reminder</heading>
6 <body>Don't forget me this weekend!</body>
7 </note>
8 </xml>
或者象下面這樣嵌入外部單獨(dú)的 XML 文件 :
<xml id="note" src="note.xml">
</xml>
注意那個(gè) <xml> 標(biāo)記是一個(gè) HTML 元素,而不是一個(gè) XML 元素。
數(shù)據(jù)綁定
XML 數(shù)據(jù)島可以綁定到 HTML 元素上(比如表格)。
在下面的例子中,一個(gè) XML 數(shù)據(jù)島( ID=cdcat )被從外部 XML 文檔載入。一個(gè) HTML 的表格綁定到此數(shù)據(jù)島上。 HTML 表格內(nèi)部的 span 元素使用 datafld 屬性和 XML 文檔相應(yīng)的 XML 元素相互綁定。
2 <body>
3 <xml id="cdcat" src="cd_catalog.xml"></xml>
4 <table border="1" datasrc="#cdcat">
5 <tr>
6 <td><span datafld="ARTIST"></span></td>
7 <td><span datafld="TITLE"></span></td>
8 </tr>
9 </table>
10 </body>
11 </html>
12
寫(xiě)到這里想起原來(lái)看 js 的一個(gè)應(yīng)用實(shí)例,以數(shù)據(jù)島實(shí)現(xiàn)了無(wú)刷新分頁(yè)程序。
代碼如下:
2
3 <xml id="users">
4
5 <userGroup>
6
7 <user>
8
9 <userid>user hcm</userid>
10
11 <name>name hechangmin</name>
12
13 </user>
14
15 <user>
16
17 <userid>user 2</userid>
18
19 <name>name 2</name>
20
21 </user>
22
23 <user>
24
25 <userid>user 3</userid>
26
27 <name>name 3</name>
28
29 </user>
30
31 <user>
32
33 <userid>user 4</userid>
34
35 <name>name 4</name>
36
37 </user>
38
39 <user>
40
41 <userid>user 5</userid>
42
43 <name>name 5</name>
44
45 </user>
46
47 <user>
48
49 <userid>user 6</userid>
50
51 <name>name 6</name>
52
53 </user>
54
55 <user>
56
57 <userid>user 7</userid>
58
59 <name>name 7</name>
60
61 </user>
62
63 <user>
64
65 <userid>user 8</userid>
66
67 <name>name 8</name>
68
69 </user>
70
71 <user>
72
73 <userid>user 9</userid>
74
75 <name>name 9</name>
76
77 </user>
78
79 </userGroup>
80
81 </xml>
82
83 <table id="datatable" datasrc="#users" temp_src="#users" DATAPAGESIZE="3" width="400" border="1">
84
85 <tr>
86
87 <td><span datafld="userid"></span></td>
88
89 <td><span datafld="name"></span></td>
90
91 </tr>
92
93 </table>
94
95 <script>
96
97 var rs=document.all.users.recordset;
98
99 // 記錄條數(shù)
100
101 var itemcount = rs.RecordCount;
102
103 alert (itemcount );
104
105 //
106
107 rs.PageSize=3; // 設(shè)定 recordset 對(duì)象的 PageSize 屬性與顯示的頁(yè)大小相同
108
109 var pageCount=rs.PageCount; // 獲得總頁(yè)數(shù)
110
111 var nowpage=1;
112
113 function first()
114
115 {
116
117 document.all.datatable.firstPage();
118
119 nowpage=1;
120
121 document.all.page.value = "";
122
123 testnum.innerText=nowpage;
124
125 }
126
127 function up()
128
129 {
130
131 if(nowpage==1)
132
133 {
134
135 document.all.page.value ="";
136
137 testnum.innerText=nowpage;
138
139 }
140
141 else
142
143 { document.all.datatable.previousPage();
144
145 nowpage=nowpage-1;
146
147 document.all.page.value ="";
148
149 testnum.innerText=nowpage;
150
151 }
152
153 }
154
155 function down()
156
157 {
158
159
160
161 if(nowpage==pageCount)
162
163 {
164
165 document.all.page.value ="";
166
167 testnum.innerText=nowpage;
168
169 }
170
171 else
172
173 {
174
175 document.all.datatable.nextPage();
176
177 nowpage=nowpage+1;
178
179 document.all.page.value = "";
180
181 testnum.innerText=nowpage;
182
183 }
184
185 }
186
187 function last()
188
189 {
190
191 document.all.datatable.lastPage();
192
193 nowpage=pageCount;
194
195 document.all.page.value = "";
196
197 testnum.innerText=nowpage;
198
199 }
200
201 function chang(num)
202
203 {
204
205
206
207 if(num<=pageCount&&num>=1)
208
209 {
210
211 first();
212
213 if(num==1)
214
215 {
216
217 nowpage=num;
218
219 document.all.page.value = "";
220
221 testnum.innerText=num;
222
223 return ;
224
225 }
226
227 for(var i=1;i<num;i++)
228
229 {
230
231 down();
232
233 }
234
235 nowpage=num;
236
237 document.all.page.value = "";
238
239 testnum.innerText=nowpage;
240
241 }
242
243 }
244
245 function count()
246
247 {
248
249 document.write(pageCount);
250
251
252
253 }
254
255 function check(str)
256
257 {
258
259 if(str<=pageCount&&str>=1)
260
261 {
262
263 document.all.changbutton.disabled=false;
264
265 }
266
267 }
268
269 </script>
270
271 共 <script>count();</script> 頁(yè)
272
273 當(dāng)前第 <span id=testnum>1</span> 頁(yè)
274
275 <input type="button" onClick="chang(document.getElementById('page').value)" id="changbutton" name="changbutton" value=" 轉(zhuǎn)到 " disabled="true">
276
277 第 <input name="page" type="text" id="page" value="" size="4" onpropertychange="check(document.getElementById('page').value);" > 頁(yè)
278
279 <br>
280
281 <button onclick="first()"> 首頁(yè) </button>
282
283 <button onclick="up()"> 上一頁(yè) </button>
284
285 <button onclick="down()"> 下一頁(yè) </button>
286
287 <button onclick="last()"> 最后一頁(yè) </button>
從這個(gè)程序里受到了很大啟發(fā)的。感覺(jué) xml 的應(yīng)用也會(huì)更加多。