XML教程
翻译:褚健
前言
自从Internet在20年前问世以来,很快就席卷了全球。Internet是当今计算机网络发展的必然。中国的Internet近几年来也正在急剧的发展。而近几年出现的Internet热,主要应归功于Web。Internet提供了世界范围内的互连和通信功能,Web则是一个巨大的信息资源库。用户只要打开浏览器就能得到他们感兴趣的资料。Web的特性使千家万户都能共享 Internet上巨大的信息资源,Web和主页已经成为计算机和通信领域乃至全社会的热点。21世纪将是全球信息数字化的时代。有关主管部门将1999-2000年定位我国“政府上网年”,预期至2000年将实现80%以上的部委与各级政府在163/169上均有站点。
到目前为止,几乎所有的Web页面都是用HTML语言编写的。HTML简单易学,句法简明紧凑,加上其扩充的表格、帧、脚本等功能,使它得以在Web主页上大显身手。但是随着Web应用的越来越广泛,HTM过于简单的弱点也越来越明显了。
1. 链接丢失后不能自动纠正。 由于许多页面的URL地址经常变化,当用户浏览这些页面时就会时常会遇到404 URL地址未找到的信息。所以维护人员不得不手工一个个地更改链接相关页面的URL地址,这大大加重了Web页面的维护工作量。
2. 动态内容需要下载的部件太多。用HTML建立的页面目前还不能对其页面的外观属性,例如色彩、字体、背景等实现更新,你只能重新下载一个新的页面或Java部件。但Java保存的数据搜索引擎是无法访问的,所以在HTML页面中使用Java来显示动态内容也不是灵丹妙药。
3. 搜索时间长。由于HTML页面没有类似于数据库的结构,在这样的文档资料中搜索目标时需要对全部页面的所有内容扫描,往往检索出一大堆与主题词无关的内容, 这是因为HTML无法区分信息与元信息而造成的。而且HTML不支持信息嵌套体系结构,因而限制了全文检索功能。
4. HTML缺乏对双字节或多国文字的支持,或者说支持不够。例如中文信息页面在不同的平台下会出现格式不齐等问题。
5. HTML可扩展性差。科学家无法用HTML书写数学公式、化学方程式以及分子晶体结构。
正是由于这些缺点,人们已经开始研究能改进或替代HTML的Web页面制作语言。其中最有成效的,并已初步投入使用的有:可扩展标记语言——Extensible Markup Language简称XML、叠式页面——Cascading Style Sheets简称CSS以及动态HTML即DHTML。这些语言从不同角度解决了HTML存在的问题:XML有利于信息的表达和结构化组织,从而使数据搜索更有效;CSS解决Web页面的继承和显示;DHTML则主要用于Web页的动态显示问题。本文着重介绍可扩展标记语言XML。
XML产生的背景
XML同HTML一样,都来自Standard Generalized Markup Language, 即标准通用标记语言,简称SGML。早在Web未发明之前,SGML就早已存在。正如它的名称所言,SGML是一种用标记来描述文档资料的通用语言,它包含了一系列的文档类型定义(简称DTD),DTD 中定义了标记的含义,因而 SGML 的语法是可以扩展的。SGML十分庞大,既不容易学,又不容易使用,在计算机上实现也十分困难。鉴于这些因素,Web的发明者——欧洲核子物理研究中心的研究人员根据当时(1989年)计算机技术的能力,提出了HTML语言。
HTML只使用SGML中很小一部分标记,例如HTML 3.2定义了70种标记。为了便于在计算机上实现,HTML规定的标记是固定的,即HTML语法是不可扩展的,它不需包含DTD。HTML这种固定的语法使它易学易用,在计算机上开发 HTML的浏览器也十分容易。正是由于HTML的简单性,使 Web 技术从计算机界走向全社会,走向千家万户,Web的发展如日中天。
近年来,随着 Web的应用越来越广泛和深入,不管HTML推出多少个新版本,已经有了脚本、表格、帧等表达功能,但始终满足不了不断增长的需求。另一方面,这几年来计算机技术的发展也十分迅速,已经可以实现比当初发明创造HTML时复杂得多的Web浏览器,所以开发一种新的Web页面语言既是必要的,也是可能的。正是在这种形势下,Web标准化组织W3C建议使用一种精简的SGML版本——XML应运而生了。
XML简介
XML是一种标识语言。一个XML元素是由开始标签、结束标签以及标签之间的数据构成的。开始和结束标签用来描述标签之间的数据。标签之间的数据被认为是元素的值。它是一个精简的SGML,将SGML的丰富功能与HTML的易用性结合到Web的应用中。它不再是固定的标记,而是允许定义数量不限的标记来描述文档中的资料,允许嵌套的信息结构。先来看一看用XML描述天气预报的实例:
<weatherreport>
<date>March 25, 1998</date>
<time>08:00</time>
<area>
<city>Seattle</city>
<state>WA</state>
<region>West Coast</region>
<country>USA</country>
</area>
<measurements>
<skies>partly cloudy</skies>
<temperature>46</temperature>
<wind>
<direction>SW</direction>
<windspeed>6</windspeed>
</wind>
<hindex>51</hindex>
<humidity>87</humidity>
<visibility>10</visibility>
<uvindex>1</uvindex>
</measurements>
</weatherreport>
为了使编写的Web页面成为有效的XML文档,文中每一添加的标记必须记入一个独立的DTD文件中。当客户浏览天气预报文档时,相关的DTD文件是随着文档一起下载到客户端,客户浏览器就懂得怎样来处理它们,例如你可以从几个天气报告中计算出平均温度等,最后将结果显示出来。
DTD文件使XML页面能包含更多的内容,表现更复杂的形式。从实例中也可以看出XML页面信息是结构化的,有些与数据库结构类似,因而更具访问性,其检索结果更有针对性、更准确。
另外你也可以将URL地址定义在DTD文件中,当Web主页地址发生变化时,你只需改动DTD文件中的定义即可,而不必一一在HTML文档中改变URL地址,从而使Web的维护更方便,用户也不会遇到URL地址找不到的信息,这样一来,Web的应用更稳定。
并不是所有的DTD文件都要下载到客户端,已经制订成为标准的协议,例如在后面第六点中提到的化学标记语言CML、数学标记语言MML等是不需要DTD文件的。
除了DTD外,XML中还包括可扩展格式语言XSL(Extensible Style Language) 和可扩展链接语言XLL(Extensible Linking Language)。
XSL用于将XML数据翻译为HTML或其他格式的语言。XSL提供了一种叠式页面CSS的功能,使开发者构造出具有表达层结构的Web页面来,以有别于XML的数据结构。XSL也能和HTML一起构造叠式页面。XSL可以解释数量不限的标记,它使Web的版面更丰富多彩,例如动态的文本、跑马式的文字。此外,XSL还处理多国文字、双字节的汉字显示、网格的各种各样的处理等。
XLL是XML的链接语言,它与HTML的链接相似,但功能更强大。XLL支持可扩展的链接和多方向的链接。它打破了HTML只支持超级文本概念下最简单的链接限制,能支持独立于地址的域名、双向链路、环路、多个源的集合链接等。XLL链接可不受文档制约,完全按用户要求来指定和管理。
为了使XML易学易用,XML精简了一大片SGML难得用一次的功能。正如几十万汉字中常用的只不过八千,SGML常用的部分只占20%,XML抛弃了SGML中不常用的部分,使它一下就精简了80%。这样一来,XML的语法说明书只有30页,而SGML却有500页。
XML设计中也考虑了它的易用性,易用性来自两个方面:一方面用户编写Web页面方便,另一方面设计人员实现XML浏览器也不太困难。
总之,XML使用一个简单而有灵活的标准格式,为基于Web的应用提供了一个描述数据和交换数据的有效手段。HTML描述了显示全球数据的通用方法,而XML提供了直接处理全球数据的通用方法。
XML基础
处理XML元素
XML是一种标识语言。一个XML元素是由开始标签、结束标签以及标签之间的数据构成的。开始和结束标签用来描述标签之间的数据。标签之间的数据被认为是元素的值。例如,在下面一个XML元素的例子中,元素“director”的值是“Éd Wood”。
<director>Ed Wood</director>
元素名(“director”)允许你把“Ed Wood”这个值标出来,这样你就能把这些数据同另外类似的数据区分开来。例如,有可能另一个元素的值也是“Ed Wood”。
<actor>Ed Wood</actor>
由于每个元素都有不同的标签名,所以你能很容易把上面两个元素的值区别开来。如果没有办法把数据标出来,两个有同样值的元素会混淆起来。
处理XML文档
一个基本的XML文档就是一个XML元素,它可以嵌套XML元素。例如,下面的XML元素“books”就是一个有效的XML文档。
<books>
<book isbn=\"0345374827\">
<title>The Great Shark Hunt</title>
<author>Hunter S. Thompson</author>
</book>
</books>
构建一个基本的XML文档需要记住关键的三点:所有元素必须有结束标签;所有元素必须正确的嵌套(不允许交迭元素);所有特征值必须加引号。
处理XML数据岛
1.什么是XML数据岛?
数据岛是指存在于HTML页面中的XML代码。数据岛允许你在HTML页面中集成XML,对XML编写脚本,不需要通过脚本或<OBJECT>标签读取XML。几乎所有能够存在于一个结构完整的XML文档中的东西都能存在于一个数据岛中。包括处理指示、DOCTYPE声明和内部子集。(注意,编码串不能放在数据岛中。)
数据岛的XML可以是内嵌的:
<XML ID=\"XMLID\">
<customer>
<name>Herbert Hanley</name>
<custID>81422</custID>
</customer>
</XML>
或者在XML标签中通过SRC属性引用:
<XML ID=\"XMLID\" SRC=\"customer.xml\"></XML>
处理指导
简单处理XML。把XML放到一个XML元素中,并且给这个XML元素一个ID。
类似于文档对象访问一个XML数据岛
什么是XML文档对象?
XML文档对象是指一个拥有属性和方法的对象,你可以利用这些属性和方法访问和处理XML文档。当一个XML数据岛被读取和解析时,就会创建一个XML文档对象。
怎样访问XML数据岛?
下面是一个带有数据岛的HTML页面。数据岛在<XML>元素中。
<HTML>
<HEAD>
<TITLE>HTML with XML Data Island</TITLE>
</HEAD>
<BODY>
<P>Within this document is an XML data island.</P>
<XML ID=\"resortXML\">
<resorts>
<resort>Calinda Cabo Baja</resort>
<resort>Na Balam Resort</resort>
</resorts>
</XML>
</BODY>
</HTML>
你能通过ID属性访问数据岛,“resortXML”成为文档对象的名称。你能利用这个对象的方法和属性访问它的根节点和孩子节点。在上面的例子中,根节点是<resorts>,孩子节点是<resort>。下面列出了一些属性和方法,可用来访问XML文档的节点。
XMLDocument:返回对XML文档对象模式的引用。l
documentElement:返回XML文档的根节点。l
l childNodes:返回节点的孩子节点目录。
item:通过索引访问目录中的个别节点。索引值是从0开始的,所以item(0)返回第一个节点。l
text:返回节点的内容。l
下面的代码访问第二个孩子节点<resort>并返回它的内容“Na Balam Resort”。resortXML.XMLDocument.documentElement.childNodes.item(1).text
访问XML对象模式
什么是XML对象模式?
微软IE5中的XML解析器揭示了XML对象模式,允许你访问和处理XML文档中的节点。当解析器读取并且解析一个XML文档时,它将建立一棵节点树,每个节点都能通过脚本来访问。
例如,如果解析器读取并且解析下面的XML文档,它将创建一个能通过文档ID值(xmlDocument)被引用的文档对象,一个表现根节点的对象和一个表现树中其余节点的对象。
怎样访问树中的节点?
请试着在下面的数据岛中找出访问每个节点所需要的代码。
<XML ID=\"xmlDocument\">
<class>
<student studentID=\"13429\">
<name>Jane Smith</name>
<GPA>3.8</GPA>
</student>
</class>
</XML>
在XML文档中使用数据类型
什么是XML文档中的数据类型?
微软提供的XML Schema版本支持数据类型。作为一项预先展示的技术,它对于那些想要用schema和丰富的数据类型构造原型和增长经验的开发者来说是很有用的。微软积极参与制定逐步形成的W3C的XML Schema标准。开发者需要注意这个版本的XML Schema是要变化的。在微软IE5当中,元素值能被指定数据类型。数据类型能够通过XML Schema或根据实际情况被指定。以前,XML元素值只有一种类型(字符串),所以开发者要处理XML文档必须花时间转换元素值。键入你的XML数据,解析器会进行数据类型转换。另外,由于元素值有特定的数据类型,所以元素值的改变也要符合数据类型。这给你提供了一种确认使用者输入的方法。
如何指定XML元素值的类型?
通过XML Schema指定元素值的类型,你必须在XML Schema的开头声明数据类型的名域和schema的名域。
<Schema xmlns=\"urn:schemas-microsoft-com:xml-data\" xmlns:dt=\"urn:schemas-microsoft-com:datatypes\">
dt前缀用来在schema中表示指定数据类型的类型属性。
<ElementType name=\"NUMBER\" content=\"textOnly\" dt:type=\"number\"/>
通过dt属性指定元素类型,你必须在XML文档的开头声明数据类型的名域。
<NUMBERS xmlns:dt=\"urn:schemas-microsoft-com:datatypes\">
dt前缀用来给一个元素的例子指定数据类型。
<NUMBERS xmlns:dt=\"urn:schemas-microsoft-com:datatypes\">
<NUMBER dt:dt=\"number\">44533</NUMBER>
</NUMBERS>
访问经过类型定义的XML值
什么是经过类型定义的XML值?
经过类型定义的XML值是指在XML Schema中被指定数据类型的元素值。XML解析器使用schema来确认文档。
微软提供的XML Schema版本支持数据类型。作为一项预先展示的技术,它对于那些想要用schema和丰富的数据类型构造原型和增长经验的开发者来说是很有用的。微软积极参与制定逐步形成的W3C的XML schema标准。开发者需要注意这个版本的XML Schema是要变化的。
除了拥有字符串值以外,每个XML元素也可以有经过类型定义的值。例如下面的XML元素:
<date>1970-09-30</date>
值可以是“1970-09-30”,也可以是经过类型定义的“Web Sep 30 00:00:00 PDT 1970.”
如何访问经过类型定义的XML值?
可以通过XML对象模式访问经过类型定义的数据。就好象你能根据元素节点的节点值性质找到元素值一样,你能根据元素本身的节点类型值找到经过类型定义的元素值。
例如,考虑一下下面的XML文档:
<?xml version=\"1.0\"?>
<weather xmlns=\"x-schema:weatherSchema.xml\">
<date>1970-09-30</date>
<degrees>67.5</degrees>
</weather>
“weatherSchema.xml”是下面这个文件:
<Schema xmlns=\"urn:schemas-microsoft-com:xml-data\"xmlns:dt=\"urn:schemas-microsoft-com:datatypes\">
<ElementType name=\"date\" content=\"textOnly\" dt:type=\"date\"/>
<ElementType name=\"degrees\" content=\"textOnly\" dt:type=\"float\"/>
<ElementType name=\"weather\" content=\"eltOnly\"/>
<element type=\"date\"/>
<element type=\"degrees\"/>
</ElementType>
</Schema>
如果你要处理“degrees”这个元素(xmlDocument.documentElement.childNodes.item(1)),你可以根据节点类型值来访问它的值(xmlDocument.documentElement.childNodes.item(1).nodeTypedValue)。
XML Schema
什么是XML Schema?
W3C XML Activity Page 声明:“尽管XML1.0提供了一种机制,文档类型定义(DTD)给标记的使用加了限制,但是对XML文档的自动处理需要更严格更全面的工具。需要主要体现在对应用软件各部分的结合、文档结构、属性和数据类型等等的约束。W3C XML Schema工作组正忙于定义XML文档的结构、内容和语义。”
微软IE5支持XML Schema,这项预先展示的技术是建立在递交给W3C的XML-Data草案的基础上的。XML Schema可被认为是XML-Data草案的子集,它符合文档内容描述(DCD)提议的特点。
IE5中的XML解析器能够根据文档类型定义(DTD)或XML Schema解析XML文档。XML Schema是用来声明内容模式的基于XML的语法。它有DTD所有的功能,并且还有其他的功能如数据类型定义。
如何建立XML Schema?
请在下面的XML文档中找一找每个节点的schema声明。
<class xmlns=\"x-schema:classSchema.xml\">
<student studentID=\"13429\">
<name>Jane Smith</name>
<GPA>3.8</GPA>
</student>
</class>
你会注意到在上面文档中默认的名域是“x-schema:classSchema.xml”。这告诉解析器根据URL(“classSchema.xml”)上的schema(x-schema)来解析整个文档。
下面是上面那个文档的完整的schema。注意schema的根元素中的名域声明。第一个(xmlns=”urn:schemas-microsoft-com:xml-data”)表明这个XML文档是一个XML Schema。第二个(xmlns:dt=”urn:schemas-microsoft-com:datatypes”)允许schema处理者在“ElementType”和“AttributeType”声明中的“type”属性前加“dt”前缀来说明元素的类型和内容的特征。
<Schema xmlns=\"urn:schemas-microsoft-com:xml-data\" xmlns:dt=\"urn:schemas-microsoft-com:datatypes\">
<AttributeType name=\studentID\ dt:type=\string\ required=\yes\/>
<ElementType name=\name\ content=\textOnly\>
<ElementType name=\GPA\ content=\textOnly\ dt:type=\float\/>
<ElementType name=\student\ content=\mixed\>
<attribute type=\studentID\/>
<element type=\name\/>
<element type=\GPA\/>
</ElementType>
<ElementType name=\class\ content=\eltOnly\>
<element type=\student\/>
</ElementType>
</Schema>
schema用“Schema”元素开头,“Schema”元素包括schema名域的声明,在本例中还包括数据类型名域的声明。Schema的内容以“AttributeType”和“ElementType”的声明开头。
<AttributeType name=\studentID\ dt:type=\string\ required=\yes\/>
<ElementType name=\name\ content=\textOnly\><ElementType name=\GPA\ content=\textOnly\ dt:type=\float\/>
这些声明接下来的是刚声明过元素的父亲元素的“ElementType”声明。
<ElementType name=\student\ content=\mixed\>
<attribute type=\studentID\/>
<element type=\name\/>
<element type=\GPA\/>
</ElementType>
这个过程继续下去,直到所有元素都已经声明了。
不同于DTDs,XML Schema允许有一个开放的内容模式,你可以进行定义数据类型、使用默认值等等操作而不必限定内容。
在下面的schema中,“GPA”元素的类型被定义并有一个默认值,但在“student”元素中没有其他节点被声明。
<Schema xmlns=\"urn:schemas-microsoft-com:xml-data\" xmlns:dt=\"urn:schemas-microsoft-com:datatypes\">
<AttributeType name=\"scale\" default=\"4.0\"/>
<ElementType name=\"GPA\" content=\"textOnly\" dt:type=\"float\">
<attribute type=\"scale\"/>
</ElementType>
<AttributeType name=\"studentID\"/>
<ElementType name=\"student\" content=\"eltOnly\" model=\"open\" order=\"many\">
<attribute type=\"studentID\"/>
<element type=\"GPA\"/>
</ElementType>
</Schema>
上面的schema允许你只确认你所关心的区域。这使你对文档有更多的控制,并允许你使用schema提供的一些特性而不必严格确认。
一些说明:
“ElementType”和“AttributeType”声明必须放在“attribute”和“element”内容声明之前。例如,在上面的schema中,“GPA”元素的“ElementType”声明必须放在“student”元素的“ElementType”声明之前。
“order”属性的默认值是建立在“content”属性的值上的。当content值为“eltOnly”时,order默认值是“seq”。当content值为“mixed”时,order默认值是“many”
发布人:netbull 来自:LinuxAid