初识XML
ArticleCategory: [Artikel Kategorie]
Applications
AuthorImage:[Here we need a little image from you]
TranslationInfo:[Author and translation history]
original in en Floris Lambrechts
en to zh surestar
AboutTheAuthor:[Über den Autor]
这几年我一直是LinuxFocus/Nederlands的主编。我现在Belgium Leuven的电子系攻读
工业工程师,并花些时间摆弄Linux,PHP,XML和LinuxFocus,同时我也阅读一些书籍,如Stephen
Hawking写的作品,(目前:)读的是Jef Raskin的‘The Humane Interface’。
Abstract:[Here you write a little summary]
这是关于XML的一个十分简要的介绍。
你会遇到Eddy the meta cat,XML语法警察(syntax police)以及一些DTD。
不要担心,我会解释的;-)
ArticleIllustration:[This is the title picture for your article]
ArticleBody:[Der eigentliche Artikel]
简介
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'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集。
- Docbook-XML
Docbook是一种用来编写结构化文档,例如书籍和报纸的语言。
不过它也用于完成许多不同的任务。Docbook实际上是一种SGML DTD(SGML是一种标注标准),
但是它也有一个-流行的-XML版本。这是最流行的XML DTD之一。
- MathML
MathML是数学标注语言,它用来描述数学表达式和公式。对于数学世界
中的人来说,这是个非常灵巧的工具。另一方面化学家也不用着嫉妒它们的数学家同事;对于他们,
同样有一个类似的工具CML,或化学标注语言。注意现在Mozilla 1.0默认提供了MathML支持.
- RDF
RDF就是资源描述框架(Resource Description Framework)。它设计
用来帮助编码和重用元数据;在实践中它经常被web站点用来告诉其它站点他们正在显示哪些新闻。
例如,荷兰站点linuxdot.nl.linux.org
使用了其它站点的RDF文件来显示他们的新闻栏目。绝大多数流行的新闻站点(例如Slashdot)都有
一个RDF文件,所以你可以复制他们的新闻头条到你主页上的如工具条之类的地方。
- SOAP
SOAP表示简单对象存取协议(Simple Object Access Protocol)。
进程使用这种语言来互相通信(交换数据和执行远程过程调用)。凭借SOAP,例如,通过http协议
(internet)之类的,进程可互相远程通信。关于SOAP,我想LF的Atif可以告诉你更多,请看链接 :-)
- SVG
可升级向量图形(Scalable Vector Graphics)。三重PNG,JPEG2000和
SVG象征着web上图像的未来。PNG会替代GIF的角色(透明的无损压缩位图),而JPEG2000有一天
会接今天.jpg的班(可配置级别的有损压缩位图)。SVG不是基于位图的,而是一种基于向量的
图像格式,这意味着它不是以像素来表示的,而是通过数学图形(直线,正方形,...)来表示。
SVG同样有如脚本编辑和动画之类的功能,所以在某种意义上你可以将它与Macromedia的Flash
比较。你可以在.svg文件中使用JavaScript,也可以使用JavaScript编写.svg代码。非常灵活,
唔?
但是svg是相当新的;目前只有Adobe的一个高质量SVG浏览器插件可用于
Windows & Mac平台。Mozilla现在致力于内嵌SVG阅读器,但是这还没有完成,而且你必须
下载一个该浏览器的特殊的编译好的版本来使用。
注意: .svg文件可以变得很大,
这就是为什么你经常遇到.svgz文件的原因。它们是使用gzip算法压缩了的版本。
- XHTML
XHTML是HTML 4.01版本的XML版。考虑到XML的严格语法,所以做了一些
变化——有些你在HTML可以做的事在XHTML却是无效的。但是另一方面,用XHTML编写的页面同时是
一个有效的HTML页。注意程序HTML tidy可以转换你现存HTML页为XML。
- 其它
许多新的文件格式使用XML,通常与.gz或.zip压缩结合。举个例子:
KOffice文件格式就是XML DTD的。这非常有用,因为它允许用户将不同应用程序的功能组合到一个
文档中。例如:你可以写一个KWord文档,里面内嵌着KChart电子表格。
链接
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