当前位置:Linux教程 - Linux - XML教程

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描述天气预报的实例:
     <weatherreport>
      <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>
      <hindex>51</hindex>
      <humidity>87</humidity>
      <visibility>10</visibility>
      <uvindex>1</uvindex>
     </measurements>
    </weatherreport>
      为了使编写的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”的值是“&Eacute;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