1、HTML 的历史,大家可以更容易理解 XML 要解决什么问题。
2、第二部分给些对 XML 的感性认识,这部分是很重要的,需要再扩充些内容。
3、第三部分和第四部分完全可以合在一起,主要讲 XML 解析器和 3 种 API。3 种 API 都需要详细讲解,而且要举出例子。
4、第五和第六部分也需要举些例子,以使程序员得到感性的认识。
5、需要把 xpath 和名字空间(namespace)详细讲一下,因为这些也是非常重要的内容。
1、HTML 的缺点以及 XML 的产生原因
HTML 最初是一种表义的标记语言。Tim Berners-Lee 最初发明 HTML 的主要目的是为了与研究物理学的同事交流的方便(他当时是 CERN(欧洲粒子物理实验室)的研究人员)。超链接可以很方便地把关于物理学研究的各种资源链接起来。HTML 最初只是设计用来交流文本信息的,最初的 HTML 显示出来就是简单的文本,没有多少表示显示格式的标记。Marc Andreessen 发现了 HTML 和超链接的商业价值,开发出了世界上第一个图形界面的浏览器 NCSA Mosaic。Andreessen 随后与别人合作开了 Netscape 公司,并且制造出当时最成功的浏览器 Netscape Navigator。为了提高浏览器的表现能力,显示更加丰富的内容,有必要扩充 HTML,添加各种与显示格式有关的标记和属性,并且把对多媒体的支持加进去。例如
XML 的设计思想来自于古老的 SGML(其实 HTML 的设计思想也是来自于 SGML)。SGML 是 IBM 创造的一个用于出版业的文档格式标准,后来被 ISO 采纳作为国际标准(ISO 8879)。SGML 把文档内容与文档格式完全分离开,使得内容提供者的与排版人员的工作可以相互独立。SGML 是一种非常严谨的标记语言,但是 SGML 的问题是过于复杂,一个基于 SGML 的出版系统开发成本高昂,价格不菲,只有象 IBM 一样的大型企业才有能力购买这样的系统。SGML 过于重量级的特点使其完全不适合用于 Web 领域,而且 SGML 的设计完全是面向文档的,而不是面向数据的,大量基于 Web 的应用是面向数据的应用。W3C 参考 SGML 设计了新一代的标记语言 XML,XML——可扩展标记语言是一种元语言(我们使用的 Eclipse 也可以称做是一种元工具),它可以建造其它任意种类的标记语言。XML 实现了 W3C 最初设定的所有目标,轻量级、易于理解、扩展性好、平台中立、兼顾文档和数据。实际上 XML 规范只有几十页,只是 SGML 规范的 1/10 左右。
注:XML 1.0 规范的中文版可以在网上找到,地址是 http://lightning.prohosting.com/~qqiu/REC-xml-20001006-cn.html
2、XML 的外观
我们来看看 XML 是什么样:
[code="java"]<book id="1">
<isbn>7-111-07315-0</isbn>
<author>Didier Martin 等</author>
<pages>944</pages>
</book>[/code]
好了,这个就是 XML,如果你熟悉 HTML 的话学习 XML 不非吹灰之力。在 XML 中的可以自定义任意的标记。
一段最低要求的 XML(文档或数据)只需要满足以下 4 个要求:
a、所有的起始标记都必须有结束标记。对于空元素可以采用这种形式表示:
b、标记区分大小写,起始标记与结束标记大小写必须一致。
c、多个起始、结束标记之间不能发生顺序错误,例如:
<br /><isbn> <br />
</isbn>
可以把 XML 看作一个堆栈,起始标记代表 push 操作,结束标记代表 pop 操作,所以必须采用后进先出的方式编写 XML。
d、所有的属性都必须有引号,引号可以是双引号也可以是单引号。一般采用双引号。
这就是最简单的 XML 的规则,简单吧?
XML 的内容当然不只这么多,可以看看《无废话 XML》以了解更多的内容。下面是一个更完整的 XML。
[code="java"]
<configure class="org.mortbay.jetty.Server">
<call name="addListener">
<arg>
<new class="org.mortbay.http.SocketListener">
<systemproperty name="jetty.port" default="8080">
10
100
30000
5000
</new>
</arg>
</call>
root
<call name="addWebApplications">
<arg></arg>
<arg><systemproperty name="jetty.home" default=".">/webapps/</arg>
<arg>org/mortbay/jetty/servlet/webdefault.xml</arg>
<arg type="boolean">true</arg>
</call>
<call name="addWebApplication">
<arg>/gwwweb</arg>
<arg>D:/WORK/gwwweb/webapps/default</arg>
</call>
<call name="addWebApplication">
<arg>/publish</arg>
<arg>D:/WORK/gwwweb/webapps/publish</arg>
</call>
<call name="addContext">
<arg>/</arg>
D:/WORK/shljjnew/webapps/default
<call name="addHandler">
<arg><new class="org.mortbay.http.handler.ResourceHandler"></arg>
</call>
</call>
<new class="org.mortbay.http.NCSARequestLog">
<arg><systemproperty name="jetty.home" default=".">/logs/yyyy_mm_dd.request.log</arg>
90
true
false
false
GMT
</new>
2000
false
</configure>[/code]
事实上,这个就是我们做开发时使用的 Jetty 的配置文件中的一部分(删除了一些内容以便于讲解)。
在这个文件中:
[code="java"][/code]
是所有 XML 文档中都必须有的 XML 声明,用途是告诉 XML 解析器文档所遵从的 XML 规范的版本和使用字符集。目前 XML 规范的最高版本就是 1.0。除了 ISO-8859-1 外(这个就是缺省的字符集,所以也可以不写),我们做开发时最常用的两个字符集是 GBK 和 UTF-8。
包含在 中的内容叫做处理指令(Processing Instruction,PI),处理指令不是 XML 的一部分,它的作用是为 XML 应用程序处理 XML 提供一些指示。注意,刚才说的 XML 声明虽然与处理指令很象,但是并不是处理指令。这个文档中并没有处理指令。我来举一个处理指令的例子,例如在文档中用到了 CSS 样式单,那么应该有这样一个类似的处理指令:
[code="java"][/code]
这个处理指令就是告诉应用程序使用哪个样式单来显示 XML。
[code="java"][/code]
是文档类型定义(DTD),指出这个 XML 是哪一类的标记语言,应该遵从哪一类标记语言的定义。除了用 DTD 的方式来定义标记语言类型外还可以用 Schema 来定义标记语言的类型。例如:
[code="java"]<wjml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://www.xxx.com/dagl wjml.xsd" xmlns="http://www.xxx.com/dagl">[/code]
这个 XML 中使用的是标准的 XML Schema。稍后我会详细讲解 DTD 和 Schema 的适用场合。
包含在 中的内容是注释,也不是 XML 的一部分,这个与 HTML 是相同的。
其它的内容都很容易理解了,注意看这个文档是否完全满足我上面讲的 4 个条件。