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=”gb2312” 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 进制

预定义实体引用

< 

<

&#x3c;

&lt;

> 

>

>

&gt;

“

"

"

&quot;

‘

'

'

&apos;

&

&

&

&amp;

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 指明必须是字符数据。

 1 <?xml version="1.0"?>
 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 声明中预先包装进去。如:

1 <?xml version="1.0"?>
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" 文件副本:

1 <! ELEMENT note (to,from,heading,body) >
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 页面 :

1 <xml id="note">
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 元素相互绑定。

 1 <html>
 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 的一个应用实例,以数据岛实现了无刷新分页程序。

代码如下:

  1 
  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 的应用也会更加多。

posted on 2007-02-15 13:16 -274°C 阅读(1109) 评论(2)  编辑  收藏 所属分类: XML


FeedBack:
# re: xml学习总结之一
2007-02-15 13:42 | BeanSoft
WAP 2.0 使用 XHTML, 不再是基于 XML 的 WML 了. 现在手机上的浏览器看普通网页除了脚本不行, 大部分内容都无问题. 我的多普达手机基本上就是 IE 手机版.  回复  更多评论
  
# re: xml学习总结之一
2007-02-15 13:48 | αβγ
谢谢,纠正。  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
 

常用链接

留言簿(21)

随笔分类(265)

随笔档案(242)

相册

JAVA网站

关注的Blog

搜索

  •  

积分与排名

  • 积分 - 928648
  • 排名 - 40

最新评论