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=” 1.0” encoding=”gb 2312” standalone=”yes”?>
其中需要注意的是在问号左右两边不能有空格。
还有其默认编码是 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 进制 |
预定义实体引用 |
< |
< |
&#x 3c ; |
< |
> |
> |
> |
> |
“ |
" |
" |
" |
‘ |
' |
' |
' |
& |
& |
& |
& |
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 的应用也会更加多。