[LinuxFocus-icon]
首页  |  站点地图  |  索引  |  搜索

新闻 | 过往期刊 | 链接 | 关于LF
This document is available in: English  Castellano  ChineseGB  Deutsch  Francais  Italiano  Nederlands  Portugues  Russian  Turkce  Arabic  

[Floris Lambrechts]
by Floris Lambrechts
<floris(at)linuxfocus.org>

关于作者:

这几年我一直是LinuxFocus/Nederlands的主编。我现在Belgium Leuven的电子系攻读 工业工程师,并花些时间摆弄Linux,PHP,XML和LinuxFocus,同时我也阅读一些书籍,如Stephen Hawking写的作品,(目前:)读的是Jef Raskin的‘The Humane Interface’。


目录:

 

初识XML

[Illustration: xml]

摘要:

这是关于XML的一个十分简要的介绍。 你会遇到Eddy the meta cat,XML语法警察(syntax police)以及一些DTD。 不要担心,我会解释的;-)

 

简介

2001年夏天,在 LSM期间, 一些LinuxFocus的编辑齐聚在Bordeaux。在LSM的文档专业组的许多谈话和讨论都转向了同一个主题: XML。漫长的(也是有趣的)时间都用来解释XML到底是什么,它适合于做什么以及我们该怎样使用它。 你所关心的,也正是这篇文章将会试着论述的。

我要感谢Egon Willighagen和Jaime Villate,他们向我介绍了XML。这篇文章有些基于Jaime 的文章中的资料。你可以从页底的链接找到它们。  

XML是什么

我们这些做文档的人对于XML是什么都多少知道一些。毕竟,它的语法与HTML 很相似,它不过是另一种标注语言,就像SGML和(又说到了)HTML一样,对吗?不错。但是它包含更多 的东西。它几乎可以用来描述最复杂的东西,同时又仍然对人保持易读性,程序编译也容易。这怎么 做到的?让我们研究一下这种不寻常的语言。

Eddy, the meta cat

首先,XML是一种标注语言。用标注语言写成的文档主要 包括两个部分:数据元数据。如果你确切地知道数据是什么,请告诉我,不过现在 我们来讨论元数据;)。简单地说:元数据是一种附加的信息,它为数据本身添加语境或者语义。 举个简单的例子:句子'My cat is called Eddy'。人都知道'cat'是一种 动物物种的名字,而'Eddy'是它的名字。不过,计算机程序不是人,它完全不知道这些。 所以我们使用元数据来为数据添加含义(当然是用XML语法!):

 <sentence>
   My <animal>cat</animal> is called <name>Eddy</name>.
 </sentence>

现在即使是不会说话的计算机程序,也能分辨出'cat'是一种物种,而'Eddie'是一个名字。 如果我们想要生成一个文档,里面所有的名字都显示为蓝色, 而所有物种都显示为红色,那么XML可以很简单地为我们做到。 只是为了从中获得乐趣,我们会得到如下的显示:

 My cat is called Eddy.

现在从理论上说,我们可以将布局信息(如这个例子中的颜色)放到一个独立的文件中,这就是 所谓的样式表(stylesheet)。当我们这样做时,我们实际上将布局信息和内容分隔开了,这被有些人 认为是Web设计TM中神圣的追求目标(Holy Grail)。到此为止,我们并没有做什么 特别的操作,添加元数据就是标注语言设计用来做的。那么,什么让XML如此特别?

语法警察

首先,XML有非常严格的语法。例如,在XML中,每个 <tag> 必须有对应用来关闭的 </tag>. [注意:当你写下 <tag></tag>而其中什么内容也没有时就有点笨了, 你也可以写成<tag />,这样最终会为你节约一些生命中的 微小时间]。
另一条规则是你不能够'混合'标签(tag)。你必须按照打开的相反顺序关闭标签。 如下这样就是无效的:

<B> Bold text <I> Bold and italic text </B> italic text </I>

语法规则规定你必须在关闭 </B>
之前关闭 </I> 标签。同时要注意,在XML文档中的_所有_元素必须都包含在标签中(当然两个外部标签除外!)。 这就是为什么在上面的例子中,我们写了<sentence>标签来 包含整个句子。没有它们,这个句子中的某些单词就会在标签之外,这类的许多事情,都会让XML语法 警察出离愤怒。
Mozilla screenshot
Mozilla's syntax police @work...

但是一支强大的警察部队毫无疑问有其优势:它带来了秩序。因为XML遵循如此严格的语法规则, 程序就可以非常容易地读取。另外,在你的XML文档中的数据是十分结构化的,这样人的读写都很简单。
实际上,在XML中的结构使得它甚至可以用来编写数据库(用HTML试试! :p)。这正是Egon Willighagen为荷兰LinuxFocus部分所做过的,他关于这个系统的文章可在页底的链接中找到。
如果你能设法成为语法检查员的好朋友,那么你甚至可以采取一些方法让警察来实际做一些 你的工作。不过要做到这样,你就得聪明地使用DTD...  

DTD

在我们上面的那个'Eddy the meta-cat'小例子中,我们已经创建了我们自己的XML标签。 当然,这种创建行为警察部队是无法容忍的!'穿着蓝色制服的人'想知道你在做什么,怎么做, 什么时候做以及(如果可能)为什么这样做。好的,没问题,你可以使用DTD来解释所有事情...

DTD允许你'创建'新的标签。实际上,它允许你创建全新的语言,只要它们是符合XML语法的。
DTD,或者Document Type Definition是一个包含了XML语言描述 的文件。它实际上是所有可能标签,它们的可能属性以及它们的可能组合的一份列表。DTD描述了 在你的XML语言什么是可能的,什么是不可能的。所以,当我们谈论'XML语言'时,我们实际上是在谈论 一个特定的DTD。

让警察投入工作

有时候,DTD会强制你在某个特定位置执行某项操作。例如, DTD可以强制你包含一个标签用来容纳文档标题。好就好在居然有软件(例如emacs模块)可以自动书写 必要的标签。
用这种方法,你的文档结构的某些部分就可以自动完成。因为语法是如此严格而且 明确定义的,DTD可以引导你完成书写文档的整个过程。当你犯错误时,例如忘记了放置一个结束标签, 这儿的警察会通知你。这样最后警官完全不会那么'愤怒';在现实世界里警官说'你有权保持沉默', XML警察却非常友好地告诉你'Syntax error @ line xxx : '... :)
而当警察为你做所有 工作时,当然*你*还可以继续关注于内容。

混合

XML最后一个重要的功能是它可以同时使用几个DTD。这意味着你可以在一个文档中 同时使用几种不同的数据类型。

T这种'混合'由xml名字空间(namespace)完成。例如,你可在你的.xml文档里包括一个Docbook DTD(如在本例中的'dbk' prefix),
所有Docbook的标签就可以在你的文档中以这种 形式使用(比如说这儿有一个docbook标签<just_a_tag>):

 <dbk:just_a_tag> just some words </dbk:just_a_tag>

使用名字空间系统,你可以使用任何xml DTD的任何标签和任何 属性。它开启了一个可能性的世界,就像你在下章中所见到的一样...  

已有的DTD

以下是一个小型的已经(或部分)在使用的DTD集。  

链接

The W3C,或 World Wide Web Consortium
这里有关于XML,MathML,CML,RDF,SVG, SOAP,XHTML,名字空间的资料...
www.w3.org

Jaime Villate的一些资料(你可能需要在线翻译器来阅读最先的两个:)
Introduction to XML(in Spanish)
How to generate HTML with XML(in Spanish)
LSM-slides

程序HTML tidy:
www.w3.org/People/Raggett/tidy

Docbook
www.docbook.org

Mozilla.org的SVG计划
www.mozilla.org/projects/svg

相关LinuxFocus文章:
Using XML and XSLT to build LinuxFocus.org(/Nederlands)
Making PDF documents with DocBook  

对这篇文章发表评论

每篇文章都有各自的反馈页面。在这个页面里,您可以提交评论,也可以查看其他读者的评论:
 反馈页面 

主页由LinuxFocus编辑组维护
© Floris Lambrechts, FDL
LinuxFocus.org

点击这里向LinuxFocus报告错误或提出意见
翻译信息:
en --> -- : Floris Lambrechts <floris(at)linuxfocus.org>
en --> zh: surestar <surestar(at)x263.net>

2002-05-28, generated by lfparser version 2.27