注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

ocean's blog

平常心——可以寂寞,但不允许空虚

 
 
 

日志

 
 

关于 XML 的一些基础知识  

2009-06-24 13:09:06|  分类: xml |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

为我公司写的 XML 培训资料。只是一个初稿,还可以展开很多内容。不少开发人员对 XML 有很多糊涂的认识,所以有必要扫扫盲。

1、HTML 的缺点以及 XML 的产生原因
HTML 最初是一种表义的标记语言,HTML 的发明人 Tim Berners-Lee 最初发明 HTML 的主要目的是为了与研究物理的同事交流方便(他当时是 CERN(欧洲粒子物理实验室)的研究人员)。超链接可以很方便地把关于物理学研究的各种资源连接起来。HTML 最初只是设计用来交流文本信息的,最初的 HTML 从外表上看就是简单的文本,没有多少表示显示格式的标记。后来 Marc Andreessen 发现了 HTML 和超链接的商业价值,开发出了世界上第一个图形界面的浏览器 NCSA Mosaic。Andreessen 随后与别人合作开了 Netscape 公司,并且制造出当时最成功的浏览器 Netscape Navigator。为了提高浏览器的表现能力,显示更加丰富的内容,就有必要扩充 HTML,添加各种与显示格式有关的标记和属性,并且把对多媒体的支持加进去。例如 <table>、<center>、<font>、<img>、align、bgcolor 等等。Netscape Navigator 大为成功,尤其是在其推出强大的脚本语言 JavaScript 和支持 plugin 并且能在页面中运行 Java Applet 后。甚至有人认为浏览器就是下一代的操作系统,将来开发的所有应用程序都应该是针对浏览器开发的。Netscape 是当年 NASDAQ IPO(新股上市)最成功的公司,Marc Andreessen 一夜之间成为了亿万富翁。这引起了软件之王 M$ 的注意和警觉,M$ 认为 Netscape 正在对其构成威胁,一定要把 Netscape 击垮,占据互联网这个战略制高点。而互联网最重要的应用软件就是浏览器,于是 M$ 推出了自己的浏览器 Internet Explorer,并且采用免费和捆绑等不正当竞争手段,在 4、5 年内将 Netscape 彻底赶出了浏览器市场。如今 Netscape 这个产品已经彻底消亡,只留下了它开源后浴火重生的 Mozilla 继续在与 IE 进行着顽强的抗争。不过由于 Linux 桌面应用已经走向成熟,所以将来 Mozilla 也会有很好的前景。在 Netscape 与 IE 角力的几年时间里,两大浏览器都为了提高自己的表现能力各出奇招。他们不断推出新的只有自己才支持的、互不兼容的 HTML 标记。W3C 为了考虑工业界的需求也在不断地扩充 HTML 规范,以求各种浏览器能够有一个兼容的基础。HTML 经历了 2.0、3.2、4.0 等重要版本后已经非常庞大,完全背离了 HTML 最初设计主要用来表义的初衷,其中含有大量表示显示格式的标记。结果是实现一个完全的 HTML 浏览器越来越困难和复杂,IE 和 Netscape 的规模都达到了 10M 以上。为 HTML 减肥的呼声越来越高。为了解决这个问题,以利于 Web 的健康发展,W3C 设计了 XML。

XML 的设计思想来自于古老的 SGML(其实 HTML 的设计思想也是来自于 SGML)。SGML 是 IBM 创造的一个用于出版业的文档格式标准,后来被 ISO 采纳作为国际标准(ISO8879)。SGML 把文档内容与文档格式完全分离开,使得内容提供者与排版人员的工作可以相互独立。SGML 是一种非常严谨的标记语言,但是 SGML 的问题是过于复杂,一个基于 SGML 的出版系统开发成本高昂,价格不菲,只有象 IBM 那样的大型企业才有能力购买这样的系统。SGML 过于重量级的特点使其完全不适合用于 Web 领域。而且 SGML 的设计完全是面向文档的,而不是面向数据的,大量基于 Web 的应用是面向数据的应用。W3C 参考 SGML 设计了新一代的标记语言 XML,XML——可扩展标记语言是一种元语言(我们使用的 Eclipse 也可以称做是一种元工具),它可以建造其它任意种类的标记语言。XML 实现了 W3C 最初设定的所有目标,轻量级、易于理解、扩展性好、平台中立、兼顾文档和数据。实际上 XML 规范只有几十页,只是 SGML 规范的 1/10 左右。

2、XML 是什么样子
我们来看看 XML 是什么样:
<book>
<title>XML 高级编程</title>
<isbn>7-111-07315-0</isbn>
<author>Didier Martin 等</author>
</book>

好了,这个就是 XML,如果你熟悉 HTML 的话学习 XML 不非吹灰之力。在 XML 中的可以自定义任意的标记。
一段最低要求的 XML(文档或数据)只需要满足以下 4 个要求:
a、所有的起始标记都必须有结束标记。对于空元素可以采用这种形式表示:
<img src="..." />
b、标记区分大小写,起始标记与结束标记大小写必须一致。
c、标记之间不能发生顺序错误,例如:
<title>
<isbn>
</title>
<isbn>
可以把 XML 看作一个堆栈,起始标记代表 push 操作,结束标记代表 pop 操作,所以必须采用后进先出的方式编写 XML。
d、所有的属性都必须有引号,引号可以是双引号也可以是单引号。一般采用双引号。

这就是最简单的 XML 的规则,简单吧?

XML 的内容当然不只这么多。可以看看《无废话 XML》以了解更多的内容。

3、开发 XML 应用的 3 个层次
基于 XML 的应用从逻辑上分成 3 个层次,下面是 XML 文档或数据,中间是 XML 解析器,上面是 XML 应用程序。XML 解析器的作用是使用某种 XML API 读入并解析 XML,将 XML 建造(Build)为内存中的数据结构,便于应用程序处理。由于 XML 是基于文本的,具有平台中立性,各种语言都有相应的 XML 解析器。

4、解析 XML 的 API
解析 XML 的 API 有几种:标准的 W3C DOM、SAX、Java 的 JDOM。
标准的 W3C DOM 就是把整个 XML 读到内存中形成一棵树状结构,然后用各种方法对这棵数进行遍历、修剪等操作。因为 DOM 是 W3C 的正式标准,所有的语言都有支持 DOM 的解析器,包括 Java、Perl、JavaScript 等等。标准 DOM 的缺点是 XML 应用程序在处理 XML 之前必须把整个 XML 读进内存,如果 XML 非常大,例如 10M,解析的过程是非常慢的。所以标准 DOM 只适合于小型 XML 的处理。为了更好地解决大型 XML 处理的问题,Java 开发人员发明了 SAX。SAX 的处理方式是这样,为每一个元素、属性、内容(这些都认为是事件)定义一个回调方法,这个回调方法由应用程序提供,解析器以流的方式读入 XML,当遇到某个元素、属性、内容时就调用相应的回调方法。SAX 的优点是处理效率高,适合处理大型 XML。缺点是对 XML 修改起来不方便,实际上 SAX 2.0 以前的版本是不支持对 XML 的修改的。而且 SAX 处理 XML 中前后相互关联的元素时也没有 DOM 方便,因为你必须自己保留以前事件的状态信息。但是 SAX 还是取得了巨大的成功,后来 SAX 还被移植到了 C++ 等语言中。除了 SAX,聪明的 Java 程序员还发明了 JDOM,JDOM 解决了标准 DOM 和 SAX 的问题,可以说是目前最好的 XML API。

关于这 3 种 API,请参考 O'Reilly 的《Java 与 XML》。

5、XML 有效性验证的方法
符合上述 4 个条件的 XML 叫做格式正确的(well-formed)XML。还有一种有效的(valid)XML。什么叫做有效的 XML 呢?
有效的 XML 就是通过某种格式定义来规定这个 XML 中只能有哪些标记、这些标记应该按照什么顺序出现,每个元素有哪些属性,这些属性的格式,取值范围等信息。然后这一类的 XML 只要经过验证符合这个格式定义就认为是有效的 XML。为什么 XML 需要经过验证,这主要是电子商务的需要。举个例子,如果你需要通过 Web 方式与客户进行交易,你把电子形式的发票发给客户,客户也会把他们的发票发给你,但是两种发票的格式不同,就好象你在说汉语他在说英语,彼此无法正常交流。所以必须要有一个统一的格式(标准)才能够展开正常的电子商务活动。XML 就是靠不同的格式定义来建造不同的标记语言的,每一种格式定义(标记语言)叫做一种词汇表(vocabulary)。

XML 的格式定义有很多种方法,包括 DTD、XML Schema、RELAX NG 等等。DTD 是参考 SGML DTD 创造出的 XML 格式定义方法。DTD 的格式定义采用与 XML 不同的语法,这使得很难直接用解析器来解析 DTD,也很难动态(runtime)验证 XML 的有效性。W3C 后来又创造出了 XML Schema。Schema 是一种新型的 XML 格式定义方法,它完全采用 XML 语法,便于解析器处理,而且对于数据格式的定义更加严格和精确,所以 Schema 更加适合面向数据的应用。现在的 XML 解析器一般都支持做 DTD 验证,也有同时支持做 DTD 和 Schema 验证的。例如我们使用的 Xerces。那么有了 Schema 是否我们就可以完全抛弃 DTD 呢?答案是否定的,由于 DTD 来自于 SGML,它非常适合面向文档的应用(SGML 完全是为文档处理而设计的)。定义相同的 XML 格式,DTD 定义要比 Schema 简练的多,Schema 定义则显得很冗长。所以 DTD 更适合面向文档的应用,而 Schema 则同时适合面向文档和面向数据的应用。因为 Schema 的格式定义很烦琐,所有有人开发了其它的格式定义方法,其中比较有前途的是 RELAX NG。RELAX NG 是一种以 RELAX(由日本人开发)与 TREX(由 XML 界的权威 James Clark 开发)为基础的模式语言。它的基本思想与 Schema 相同,也采用 XML 格式,所以程序处理起来也很方便。而且它的语法比 Schema 要简单的多。但是目前 RELAX NG 还不是 W3C 的标准,所以大多数解析器都不支持。我的看法是 Schema 可能会在以后参考 RELAX NG 而得到简化,所以我们还是应该更多地使用 Schema。

6、XML 与显示的结合
上面说到过,XML 的设计目标就是把内容与显示格式分离开。那么显示格式用什么来定义呢?有两种方式,CSS 和 XSLT。XML 文档是可以用 CSS 来定义显示格式的(这里有个例子:http://www.wespoke.com/atom.xml),不过现在最流行的还是 XSLT。原因与 Schema 一样,XSLT 是 XML 格式的,便于程序处理。

XSLT 是参考 SGML 中的 DSSSL 而设计的。最初叫做 XSL,但是后来 W3C 发现工作量实在太大就分成了两个规范:XSLT 和 XSL:FO。XSLT 很快就作为正式规范推出了,主要是面向转换应用的。XSL:FO 主要面向精确的格式定义(例如 PDF),正式规范才推出不久。我们主要用到 XSLT,因为 XSLT 目前已经达到了实用的阶段。XSLT 的主要作用是将 XML 由一种格式转换为另一种格式。例如由 XML 的一种 vocabulary 转换为另一种 vocabulary,或者由 XML 转换为 HTML 或者 XHTML,便于在浏览器中显示。现在 IE 和 Mozilla 都可以很好地支持 XSLT。所以 XML 页面要在浏览器中显示必须结合 CSS 或者 XSLT 样式单。XML+XSLT 与我们熟悉的 HTML+CSS 的功能大致相同。有人认为 HTML+CSS 已经是是落后的技术,应该完全被 XML+XSLT 取代。这是一个错误的观念,连 W3C 都没有敢肯定 HTML+CSS 一定会被 XML+XSLT 取代。XML+XSLT 的缺点主要是成本和复杂性。由于缺乏所见即所得的(WYSIWYG)页面编辑器的支持,对于实现相同显示效果的复杂页面,XML+XSLT 的工作量要比 HTML+CSS 大得多。而且页面制作人员完全不能适应 XML+XSLT 的工作方式(这是程序员的工作方式),强求他们采用 XML+XSLT 是不现实的。Dreamweaver 目前已经可以非常好地支持 CSS 了。所以在可预测的未来很长一段时间,HTML+CSS 仍然是 Web 页面开发的主流技术。当然 HTML 将逐渐被 XHTML 所代替,但是这是另外的问题。XHTML 就是用 XML 来改造 HTML,使 HTML 至少符合 XML 格式正确的要求。

关于 XSLT 首先应该看看《无废话 XML》这本书。

相关资料:
《无废话 XML》
《W3C XML 规范》
《XML 高级编程》
《Java 与 XML》
《XML Schemas》
《XHTML 教程》

http://www.javaeye.com/topic/2677

  评论这张
 
阅读(119)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018