1 . XML 與 DTD —— XML 入門知識
1.1 為什么要學習xml
XML 發展的非常迅速,這實在令人感到驚奇,有很多的軟件開發商都采用了 XML 標準。我們相信,在未來的 Web 開發中, XML 將和 HTML 一樣受到重視,他們都是 Web 技術的基礎。就連無線標記語言 (WML , The Wireless Markup Language ), [ 用于標識運行于手持設備上(比如:手機)的 Internet 程序 ] , WML 都采用了 XML 的標準。 XML 將成為最普遍的數據操縱和數據傳輸的工具。
1.2 什么是XML
XML 是 EXtensible Markup Language 的縮寫。
XML 使用文檔類型定義( DTD )或者模式( Schema )來描述數據 。
XML 使用 DTD 或者 Schema 后就是自描述的語言 。
1.3 XML 和HTML的主要區別
XML 是被設計用來描述數據的,重點是:什么是數據,如何存放數據。
HTML 是被設計用來顯示數據的,重點是:顯示數據以及如何顯示數據更好上面。
他們在格式上也存在巨大區別,相對講 xml 格式要求嚴格:
a. 所有的 XML 文檔必須有一個結束標記
開始標簽和結束標簽必須配套,也就是必須寫成 <p></p> 或者 <high></ high > 。
b. 空元素必須關閉
不允許出現單標簽,但標簽必須關閉,關閉使用 <p/> 或者 <high/> 。
c. 所有標簽都區分大小寫
d. 所有標簽都必須合理嵌套
層次合理比如 <p><high></high></p> 這樣就合理。
e. 所有標簽的屬性值必須使用雙引號 (””) 或者但引號括起來
f. xml 只能有一個根元素
1.4 XML 文檔組成
xml 文檔在邏輯上主要有以下 5 個部分組成:
1.xml 聲明
xml 文檔總是以一個 xml 聲明開始,其中指明所用的 xml 版本、文檔的編碼、文檔的獨立性信息。格式為:
<?xml version=”
其中需要注意的是在問號左右兩邊不能有空格。
還有其默認編碼是 utf8
yes 表示文檔是獨立文檔,即不依賴于外部文檔。
2. 文檔類型聲明
我們可以用 DTD ( Document Type Definition 文檔類型定義)來規范 xml 文檔中元素和屬性的規則及相互關系。
XML 從 SGML ( Standard Generalized Markup Language,SGML 標準通用標記語言)繼承了用于定義語法規則的 DTD 機制。幾乎所有的 xml 應用都是使用 DTD 來定義的。 DTD 文件也是一個文本文件,通常用 ”.dtd” 作為其擴展名。
通過文檔類型聲明,指出 xml 文檔所用的 DTD 。文檔類型聲明有兩種形式,一種是聲明 DTD 在一個外部文件中,例如:
<!DOCTYPE greeting SYSTEM “hello.dtd”>
另 1 種是直接在 xml 給出 dtd ,例如:
<!DOCTYPE greeting [
<!ELEMENT greeting (#PCDATA)>
]>
3. 元素
XML 元素命名必須遵守下面的規則:
元素的名字可以包含子母,數字和其他字符。
元素的名字不能以數字或者標點符號開頭。
元素的名字不能以 XML( 或者 xml , Xml,xMl...) 開頭。
元素的名字不能包含空格。
盡量不用冒號,冒號在名稱空間中用于分隔名稱空間前綴和本地部分。
有 2 個細節:
1. CDATA 段
CDATA 段中包含的都是純字符數據,在字符數據可以出現的任何地方都可以使用 CDATA 段。 CDATA 段主要用于需要將整個文本解釋為字符數據而不是標記的情況下。
CDATA 段以字符串 ”<![CDATA[ ” 開始, ”]]>” 結束。
2. 字符引用和預定義實體引用
xml 有 5 個特殊字符,小于 < 、大于 > 、雙引號 ” 、單引號 ’ 、和號 & 。在數據中需要使用這幾個字符時候可以用通用字符引用和預定義引用:
請參考:表 1-1 特殊字符的字符引用和預定義實體引用
字符 |
字符引用 10 進制 |
字符引用 16 進制 |
預定義實體引用 |
< |
< |
|
< |
> |
> |
> |
> |
“ |
" |
" |
" |
‘ |
' |
' |
' |
& |
& |
& |
& |
4. 注釋
在 XML 中注釋的語法基本上和 HTML 中的一樣。 <!-- 這是一個注釋 --> 。注釋不要出現在標記中。
5. 處理指令
處理指令允許文檔中包含由應用程序來處理的指令。處理指令的語法和 xml 聲明類似,以 < ?開始,以 ?> 結束。一個常見的樣式表單的處理指令如下所示:
<?xml–stylesheet href=”hello.css” type=”text/css”?>
1.5 關于DTD
符合語法的 XML 文檔稱為結構良好的 XML 文檔。
通過 DTD 驗證的 XML 文檔稱為有效的 XML 文檔。
XML Schema(XML 模式 ) 是基于 XML 的 DTD 的替代品。
通過 DTD ,你的每一個 XML 文件都自身攜帶有關它自身格式的說明。
通過 DTD ,不同群體的人們可以對使用普通的 DTD 來交換數據的方法達成一致。
含有 DTD 的實例 XML 文件:
#PCDATA 指明必須是字符數據。
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 對于你的 XML 文件是外部而言,那么它會在含有以下句法構造的 DOCTYPE 聲明中預先包裝進去。如:
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 (全稱是:可擴展的樣式單語言,the eXtensible Stylesheet Language)比CSS樣式單功能要強大的多。XSL的一個主要的用途就是將XML文檔轉換成HTML格式的文件,然后再交付給瀏覽器,由瀏覽器顯示轉換的結果。是XML的可擴展樣式單語言。
1.7 XML 數據島
在 HTML 頁面中嵌入 XML 數據
使用非官方標準的 <xml> 標記可以將 XML 數據嵌入到 HTML 頁面中。
XML 數據可以象下面的例子那樣嵌入 HTML 頁面 :
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>
或者象下面這樣嵌入外部單獨的 XML 文件 :
<xml id="note" src="note.xml">
</xml>
注意那個 <xml> 標記是一個 HTML 元素,而不是一個 XML 元素。
數據綁定
XML 數據島可以綁定到 HTML 元素上(比如表格)。
在下面的例子中,一個 XML 數據島( ID=cdcat )被從外部 XML 文檔載入。一個 HTML 的表格綁定到此數據島上。 HTML 表格內部的 span 元素使用 datafld 屬性和 XML 文檔相應的 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
寫到這里想起原來看 js 的一個應用實例,以數據島實現了無刷新分頁程序。
代碼如下:
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 // 記錄條數
100
101 var itemcount = rs.RecordCount;
102
103 alert (itemcount );
104
105 //
106
107 rs.PageSize=3; // 設定 recordset 對象的 PageSize 屬性與顯示的頁大小相同
108
109 var pageCount=rs.PageCount; // 獲得總頁數
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> 頁
272
273 當前第 <span id=testnum>1</span> 頁
274
275 <input type="button" onClick="chang(document.getElementById('page').value)" id="changbutton" name="changbutton" value=" 轉到 " disabled="true">
276
277 第 <input name="page" type="text" id="page" value="" size="4" onpropertychange="check(document.getElementById('page').value);" > 頁
278
279 <br>
280
281 <button onclick="first()"> 首頁 </button>
282
283 <button onclick="up()"> 上一頁 </button>
284
285 <button onclick="down()"> 下一頁 </button>
286
287 <button onclick="last()"> 最后一頁 </button>
從這個程序里受到了很大啟發的。感覺 xml 的應用也會更加多。