XML入门

来源:互联网 发布:软件开发java招聘信息 编辑:程序博客网 时间:2024/06/11 22:00
XML入门 
  了解XML将帮助你明白为什么说它是建立Web应用的完美选择
  (作者:Scot Wingo )
  
  
    如果你已经有了自己的个人网站或自己的公司网站,或者你已对Web有了相当的了解,那你可能已经注意到了有关一门新的Web技术的疯狂地讨论---XML。在今年早些微软公司发布了IE5(第一个商业化的支持XML标准的浏览器)后,这种疯狂的热情已经变成了大家争相参与的事实。在这里,你也许会问自己一个很重要的问题:
  
  
  
    1.什么是XML?
  
    
  
    XML是可扩展标志语言(eXtensible Markup Language)的简称.象HTML一样,XML是从所有标志语言的元语---标准通用标志语言SGML(Standard Generalized Markup Language)那里派生出来的.SGML是一种元语言,也可以称为一个定义诸如HTML等标志语言的系统.XML也是一种元语言,一个定义Web应用的SGML的子集.和SGML一样,你也可以用XML来定义种种不同的标志语言满足不同的需要,特别在数据表现方面.
  
    
  
    随着Web应用的不断发展,HTML的局限性也越来越明显的体现出来了:
  
    
  
    首先,HTML是一种界面技术:它把数据和数据的表现形式混在了一起,这使得分开两者变得相当的困难.
  
    它有一个复杂的标签集:你不能用你自己的特定应用标签来扩展它.
  
    它是"平面型"的:你不能指定一种数据的层次结构来表现数据间诸如包含,重要性等这些细节.
  
    它不能把数据简单地传送给客户端让客户端自行进行进一步的处理.事实上,HTML总是在服务器端产生,客户端只是一个显示机器.
  
    它只能提供一种显示方式给你的数据.如果你想提供不同的显示方式,你就不得不在服务器端重新产生这些数据和完整的HTML页,这样才能在客户端显示出来.如果数据和显示形式是分离的话,那你就可以把数据下载到客户端,之后根据你的需要随意发送有关这些数据的不同的显示方式.
  
    它的可读性不强,无论是人读还是计算机读都是一样.HTML也不是很严谨.有些标签需要匹配开始符和结束符
  
    (象<body>和</body>),但是也有一些只有开始符没有结束符(象<p>和<b>).HTML解释器不得不处理这些有点随机的格式.
  
    HTML和XML是World Wide Web Consortium,简称W3C 制定的标准.W3C的成员意识到随着互联网的飞速发展,必须要找到一种办法将数据和网页的表现方式分离开来----因此XML诞生了.为什么不就用SGML呢?这里我不想列举那些恼人的细节,反正有足够的理由来证明SGML相当的复杂(它的说明有500多页);XML标准远比它简单(只有少少的26页).
  
    尽管严格地讲,XML只是一种数据标志说明语言,但它已经开始渐渐地把一系列相关的技术包含进来了,象XML DOM,XSL,XLL,XML 命名空间和VML.在本文中,我们将看到XML,XSL(eXtensible Style Language可扩展形式语言),和XML DOM (Document Object Model文档对象模型)这几种先进的技术,我们还会介绍其他的标准.
  
    
  
    2.剖析一个XML文件
  
    
  
    XML 1.0标准可以在www.w3.org/TR/REC-xml这个网址上找到.不过要注意,虽然那不是学习XML的最好去处,但在你看完这篇文章后,请再看看它,相信你会有更深的体会.
  
    在看第一个例子之前,让我们先熟悉一下XML的命名系统.与HTML类似,一个XML的开始标签是这样声明的<标签>.结束标签也类似,不过在小于号后面要加一个前斜杠</标签>.一个标签对和它中包含的内容,象<movie>Gone with the Wind</movie>,被称为一个元素.所有在一个开始标签和一个结束标签中的东西都被称为一个元素的内容.在上面的例子中,Gone with the Wind是movie这个元素的内容.XML的开始标签也可以是属性列表,象<tag attribute1="100" attribute2="200">.
  
    
  
    如果XML文件遵循了基本的标准规则(以后会详细介绍),那么它们就是格式正确的XML文件.而所要遵循的最基本的规则就是每一个有开始标签的元素都要有一个相应的结束标签,而且子元素的结束标签一定要在包含它的母元素的结束标签之前.
  
    
  
    例如,这就是不和规则的形式:
  
  
  
    <auction_item>
  
     <description>
  
    </auction_item>
  
     </description>
  
    而这是合乎规则的形式:
  
    <auction_item>
  
     <description>
  
     </description>
  
    </auction_item>
  
  
  
    在W3C的XML标准中有完整而详细的规则列表.一个格式正确的XML文件必须至少包含一个元素.也就是说,文件中必须有根元素(不在其他任何一个元素中的元素).这使得每一个XML文件都是一个层次分明的元素列表.XML文件通过把元素置于其他标签对中,来定义产生这种元素间的层次关系(父子,兄弟关系).
  
    为了说明这一点,让我们来看一个例子:
  
    
  
    表 A: XML格式的航空公司的航线数据示例
  
  
  
    <?xml version='1.0'?>
  
    <!-- This is an example of airline flights in XML -->
  
    <flight_schedule>
  
     <flight flight_number="1073/61">
  
      <origination>
  
       <city> Raleigh, NC </city>
  
       <airport> RDU (Raleigh Durham Intl.)</airport>
  
      </origination>
  
      <destination>
  
       <city> San Francisco </city>
  
       <airport> SFO (San Francisco Intl.)</airport>
  
      </destination>
  
      <connection>
  
       <city> Charlotte, NC </city>
  
       <airport> CLT </airport>
  
      </connection>
  
      <airline> US Airways </airline>
  
      <price>1492.00</price>
  
      <aircraft>
  
       <manufacturer> Boeing </manufacturer>
  
       <model> 747 </model>
  
      </aircraft>
  
      <movie> No </movie>
  
      <meal> dinner </meal>
  
      <departure_time> 11:00 </departure_time>
  
      <arrival_time> 14:00 </arrival_time>
  
     </flight>
  
    <!-- More flights would go here, check the data file for an example -->
  
    </flight_schedule>
  
  
  
    表A是一些以XML格式表述的航空公司的航线数据.你可以看到XML相对来说可读性比较强.标签和它们的内容都具有相当的自释性.如果在一个HTML表单中又会是怎样的呢?
  
    你几乎不可能把数据从网页中分离出来.但在XML格式下,我们可以轻松地用一个旅行代理程序得到这些数据,把它们存到一个数据库中,或重新格式它的显示方式.
  
    现在让我们进一步剖析这个例子.第一行是XML的标准标题:
  
    <?xml version="1.0" ?>
  
    这个标题告诉处理程序(在这里指IE5 XML解释器和浏览器)这是一个XML文件,同时声明这个文件遵从哪一个XML版本(到现在为止只有1.0版).
  
    文件的下一行是一个注释:
  
    <!--An example of airline flights in XML-->
  
    XML的注释格式和HTML一样,你可能对此早已熟悉.但是与HTML不同的是,XML文件中所有的开始标签都必须匹配一个结束标签,所以在层次结构首部的开始标签<flight_schedule>,必须有一个匹配的结束标签,</flight_schedule>,在文件的结尾.
  
    剩下的则是一系列被开始标签和结束标签定义的元素.这个例子描述了一个有两个航班的航班时间表.每一个航班都包含了下面所示的层次化的数据:
  
  
  
    Origination
  
     City
  
     Airport
  
    Destination
  
     City
  
     Airport
  
    Connection
  
     City
  
     State
  
     Airport
  
    Airline
  
    Price
  
    Aircraft
  
     Manufacturer
  
     Model
  
    Departure_time
  
    Arrival_time 
 -------------------------------------------------------------------------------

  了解XML将帮助你明白为什么说它是建立Web应用的完美选择
  (作者:Scot Wingo )
  
  
    3.格式正确的XML文档VS有效的XML文档
  
  
  
    一个正确编写的XML文档可以有两种形式:它可以是格式正确的或者是有效的.如果一个XML文档在编写时遵从了XML标准中所列的规则,那么它就被认为是格式正确的.如果一个XML文档在编写时还遵循了一个标准的文件数据格式或组织架构,那么它就被认为是有效的.
  
    
  
    在使用XML交换数据时,有效性是相当重要的.如果我有一个有关发票的XML文档而且我想和我的商业伙伴通过它来交换数据,那我该怎么办呢?显然,我首先要告诉我的伙伴我想要的文件格式和我的文档将遵从的格式.
  
    
  
    目前有两种方法可以用来详细定义XML文档的格式:Document Type Definition(DTD)和XML Schema.DTD是XML1.0标准中的一部分,所以它们目前是最流行的定义方法.但是问题在于DTD使用的语法非常不直观,这就与XML的宗旨背道而驰.而且DTD不能让你自己指定不同元素的类型.
  
    
  
    XML Schemas说明规格则是由微软和其他XML业界公司提出来的,被W3C视为未来DTD的替代者.XML Schemas使用一种类XML语法来描述XML文档.另外,XML Schemas提供了在文件中描述元素类型的功能(通过XML-Data).在我们看来,对那些非SGML专业人员而言,Schemas比DTD更容易阅读,更容易理解,也更容易编写.
  
    
  
    XML能够让你轻松地定义自己的文件格式和标签,不过如果每一个人都使用他自己定义的文件格式的话,恐怕就没有人能彼此交换相似的文件信息了.目前有两个比较正式的"通用文件"标准组织,而且两者相互对立.在这种对峙的情况下,很多公司不得不痛苦地游离在两大阵营之间.
  
    
  
    BizTalk.这个由微软公司领导的组织希望建立一个为通用商务文件(发票,订单等)服务的平台.
  
    XML.org.这个组织则站在与微软公司对立的角度上,提倡用DTD来定义基本商务文件格式.
  
    
  
    究竟哪一个标准会在这场游戏中取得最后的胜利,现在评论还为时过早.将来最有可能出现的情况是有两到三种流行的文件格式,而转换工具会帮助人们把文件从一种格式转换到另一种格式.
  
    
  
    4.XML Document Object Model
  
    
  
    如果你现在已经有了一个XML文件,你该如何对它进行操作呢?在下一节中,我们将介绍如何将一个XML文件转换成一个HTML文件在浏览器上显示出来,这一节我们要介绍的是使用XML Document Object Model(DOM)来读写XML文件.当一个XML处理器解析了一个XML文档后,处理器把该文档保存到一个内存空间树中.DOM是访问该树的程序化接口,通过它你可以读,添加,删除和编辑树中的节点.
  
    图A展示了我们的实例文件保存到一个内存空间树中的情况.每一个DOM树都以一个文件对象为起点,所有的数据都保存其中.
  
    
  
  
  
    图A
  
    在IE5中,可以通过任何一个程序或脚本语言对XML DOM进行访问.例如,在表B中的javascript将改变美洲航空公司第一个航班的航线:
  
    
  
    表B: 用javascript将改变美洲航空公司第一个航班的航线
  
    
  
    var myDocument = new ActiveXObject("microsoft.xmldom");
  
    myDocument.load("flights.xml");
  
    myDocument.documentElement.childNodes.item(0).childNodes.item(3).text
  
    = "American Airlines";
  
    
  
    程序的第一行创建了一个空的DOM对象.第二行通过document.load()方法把我们的数据文件引入到DOM对象中.最后,在最后一行用一个很长的命令去访问第一航班的航线的节点并改变其中属于"美洲航空公司"的节点的内容.这一切是通过childNodes属性实现的,它使我们可以通过一个数字索引来访问某个子节点.DOM还提供了很多其他的方法让我们可以通过名称或其他属性来访问节点.
  
    上面的例子显然很一般,不过它很好地向我们展示了有关DOM的程序是个什么样子.如果你想用XML进行一些工作,就必须要了解DOM,同时还要学会如何操作、访问文档对象树.
  
    
  
    5.显示XML
  
    
  
    在显示XML数据的时候,你有两种选择:创建一个Cascading Style Sheet(CSS)来产生基于这些数据的HTML格式,或者使用另一项马上将成为一个标准的XML技术,可扩展的格式语言eXtensible Style Language.
  
    选择什么方法依赖于要显示数据的复杂性.如果你只想有一个基本的输出的话,CSS是一个不错的选择.例如,你可以产生一个简单的表单,航班信息用灰色,航空公司信息用兰色,字体用Helvetica font.对于更多的复杂的输出,就需要使用XSL了.如果你想让用户点击某一个标题后就得到一个航班的分类表,而且你还想用多种形式来表现你的数据,那么XSL对你而言是一个更好的选择.同样,XSL也是使用一种类XML语法来描述如何将XML转换为HTML,所以对你而言它也许不会象CSS那样陌生而难懂.
  
    现在让我们再看一看我们的航班例子,我们用XSL来把它转换为一个可显示的格式--表C展示了我们是如何进行这样的转换的.
  
    
  
    表 C: 用XSL来把它转换为一个可显示的格式:
  
    <?xml version='1.0'?>
  
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
  
     <xsl:template match="/">
  
      <HTML>
  
       <BODY>
  
        <TABLE BORDER="2">
  
         <TR>
  
       <TD>Destination</TD>
  
          <TD>Airline</TD>
  
          <TD>Movie</TD>
  
          <TD>Meal</TD>
  
         </TR>
  
         <xsl:for-each select="flight_schedule/flight" order-by="destination">
  
          <TR>
  
           <TD><xsl:value-of select="destination"/></TD>
  
           <TD><xsl:value-of select="airline"/></TD>
  
           <TD><xsl:value-of select="movie"/></TD>
  
           <TD><xsl:value-of select="meal"/></TD>
  
          </TR>
  
         </xsl:for-each>
  
        </TABLE>
  
       </BODY>
  
      </HTML>
  
     </xsl:template>
  
    </xsl:stylesheet>
  
    
  
    第一行是XSL的标准首部(你可以通过W3C发布的XSL工作文档了解到更多它的确切含义).
  
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
  
    下一行告诉XSL处理器处理XML文件中的每一个记录.
  
    <xsl:template match="/">
  
    XSL文件中可以包含HTML标签.它们是定义HTML表单开始的HTML元素.之后我们有一个XSL for-each声明,声明我们将按目的地顺序循环处理每一个航班元素.
  
    <xsl:for-each select="flight_schedule/flight" order-by="destination">
  
    在每一个循环中,HTML标签将会和XSL选择声明得到的值组成表单中的元素,它们把要得到的航班元素中的相应值抽取出来,并把它们转换为字符串放置到HTML表单中:
  
    <TR>
  
     <TD><xsl:value-of select="destination"/></TD>
  
     <TD><xsl:value-of select="airline"/></TD>
  
     <TD><xsl:value-of select="movie"/></TD>
  
     <TD><xsl:value-of select="meal"/></TD>
  
    </TR>
  
    图B展示了这些XSL命令应用到航空公司航班数据文件上的结果.
  
  
  
    图B
  
    注意:如果你把下面这条处理说明添加到XML首部以后,IE5会自动应用XSL命令到指定的XML文件上.
  
    <?xml-stylesheet type="text/xsl" href="flight1.xsl"?>
  
    XSL是一个非常高级的语言.如果你想了解更多的细节,你可以到www.w3.org上读一读相关的标准或者到msdn.microsoft.com/xml上读一读微软公司优秀的在线用户指南.
  
    
  
    使用XSL来实现多样的表现形式
  
    
  
    XML/XSL的一种重要应用就是实现多样的表现形式.因为数据和表现形式是分离的,不象在HTML下你需要编写一个全新的表现形式同时还不得不重新引入所有的数据,所以你可以简单地改变XSL来产生一个新的表现形式.例如,如果有用户想通过飞机的类型来分类航班数据,你可以用下面的代码提供一个"飞机的分类显示"
  
    <xsl:for-each select="flight_schedule/flight" order-by="aircraft">
  
    当显示的时候,就会产生一个如图C所示的飞机分类表.
  
  
  
    图C
  
    
  
    6.Netscape 怎样呢?
  
    
  
    这里绝大部分的例子都集中在了Internet Explore 5.0对XML的支持上,那么Netscape Navigator对XML的支持是怎样的呢?你可能已经听说了,下一个Netscape的浏览器,目前人们称之为Gecko,将建立在一个称为Mozilla.org的开放源码方案之上.有关Gecko对XML的支持,在Mozilla.org的站点上已经有了详细的说明.这里我们向读者展示几个有关的它的说明.
  
    在Gecko中Mozilla.org将使用一个称为expat的免费XML解析器.
  
    将提供对XML/CSS的完全支持.
  
    其中没有提到XSL,因为它还不是一个标准.
  
    完全支持DOM.
  
    Gecko的用户接口将采用一种基于XML的语言XUL,XML-based user-interface language的简写.如果想了解更多的细节可以去参阅www.mozilla.org/rdf/doc/xml.html.
  
    尽管目前IE5的市场份额在增大,但很可能你还是要等到一个支持XML的Netscape的浏览器发布以后才能真正在你的浏览器上实现对XML的支持.不过这并不妨碍你今天在服务器端使用XML.
  
    
  
    服务器对XML的支持
  
    
  
    我们对微软公司的Internet Information Server 5.0进行了测试,结果发现它支持所有我们测试过的XML特性.你可以使用Internet Server API,Active Server Pages, 或CGI 脚本语言来引入XML,使用和IE5相同的XML解析器.
  
    
  
    在服务器端使用XML时,你要把一个XML文件装入到内存中,或者用Active Data Objects(ADO)产生一个内存中的映象.一旦在服务器端你装入了一个XML文件,你就可以通过DOM来操作它,和一个商业伙伴交换该文件,或者使用XSL或CSS将它转换为HTML文件显示到用户的浏览器上.
  
    另一项功能是你可以探测出用户正在使用的浏览器是什么类型.如果用户的浏览器是IE5,你可以把XML数据发送到浏览器端,之后在客户端进行操作.如果是别的浏览器,你可以进行纯粹的服务器端的操作.这一策略将为你在XML流行的将来作好准备.
  
    
  
    7.总结
  
    
  
    这里将对使用XML建立Web应用的优点进行一下总结:
  
    
  
    XML可以让你和商业伙伴方便地交换数据.
  
    XML可以让你自由地在你的服务器端或客户端引入、操作数据.这使得你可以轻松地将服务器上不同来源的数据结合在一起.
  
    在浏览器上使用XML,你可以避免烦琐的数据操作.想象一下如果我们的航班数据有2MB,那么每次当用户想改变显示方式时我们都不得不重新发送它们.如果使用了XML的话,数据保存在浏览器中,我们可以非常轻松地改变这些数据的表现形式.
  
    使用XSL,你只要简单地改变一下显示形式的描述,就可以实现针对任何一个XML数据的多种的表现形式.你不用每页都重新引入那些数据.而针对数据的更新将自动地在你的数据的表现形式上体现出来.如果你以前从事过面向对象的编程或者学习过模型设计,你会发现这一点跟举世公认的Model-View-Controller模式一样.
  
    
  
    我们希望这篇文章能给你足够多的XML知识,去燃起你心中使用这项激动人心的新技术的热情. 
原创粉丝点击