XML入门 ()


  
  3.格式正确的XML文档VS有效的XML文档
    
  
  一个正确编写的XML文档可以有两种形式:它可以是格式正确的或者是有效的.如果一个XML文档在编写时遵从了XML标准中所列的规则,那么它就被认为是格式正确的.如果一个XML文档在编写时还遵循了一个标准的文件数据格式或组织架构,那么它就被认为是有效的.
  
  
     
  
  在使用XML交换数据时,有效性是相当重要的.如果我有一个有关发票的XML文档而且我想和我的商业伙伴通过它来交换数据,那我该怎么办呢?显然,我首先要告诉我的伙伴我想要的文件格式和我的文档将遵从的格式.
  
  
  
  
  
  目前有两种方法可以用来详细定义XML文档的格式:Document Type Definition(DTD)XML Schema.DTDXML1.0标准中的一部分,所以它们目前是最流行的定义方法.但是问题在于DTD使用的语法非常不直观,这就与XML的宗旨背道而驰.而且DTD不能让你自己指定不同元素的类型.
  
  
  
  
  
  XML Schemas说明规格则是由微软和其他XML业界公司提出来的,W3C视为未来DTD的替代者.XML Schemas使用一种类XML语法来描述XML文档.另外,XML Schemas提供了在文件中描述元素类型的功能(通过XML-Data).在我们看来,对那些非SGML专业人员而言,SchemasDTD更容易阅读,更容易理解,也更容易编写.
  
  
  
  
  
  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.0XML的支持上,那么Netscape NavigatorXML的支持是怎样的呢?你可能已经听说了,下一个Netscape的浏览器,目前人们称之为Gecko,将建立在一个称为Mozilla.org的开放源码方案之上.有关GeckoXML的支持,Mozilla.org的站点上已经有了详细的说明.这里我们向读者展示几个有关的它的说明.
  
  
  在GeckoMozilla.org将使用一个称为expat的免费XML解析器.
  
  
  将提供对XML/CSS的完全支持.
  
  
  其中没有提到XSL,因为它还不是一个标准.
  
  
  完全支持DOM.
  
  
  Gecko的用户接口将采用一种基于XML的语言XUL,XML-based user-interface language的简写.如果想了解更多的细节可以去参阅www.mozilla.org/rdf/doc/xml.html.
  
  
  尽管目前IE5的市场份额在增大,但很可能你还是要等到一个支持XMLNetscape的浏览器发布以后才能真正在你的浏览器上实现对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来操作它,和一个商业伙伴交换该文件,或者使用XSLCSS将它转换为HTML文件显示到用户的浏览器上.
  
  
  另一项功能是你可以探测出用户正在使用的浏览器是什么类型.如果用户的浏览器是IE5,你可以把XML数据发送到浏览器端,之后在客户端进行操作.如果是别的浏览器,你可以进行纯粹的服务器端的操作.这一策略将为你在XML流行的将来作好准备.
  
  
  
  
  
  7.总结
  
  
  
  
  
  这里将对使用XML建立Web应用的优点进行一下总结:
  
  
  
  
  
  XML可以让你和商业伙伴方便地交换数据.
  
  
  XML可以让你自由地在你的服务器端或客户端引入、操作数据.这使得你可以轻松地将服务器上不同来源的数据结合在一起.
  
  
  在浏览器上使用XML,你可以避免烦琐的数据操作.想象一下如果我们的航班数据有2MB,那么每次当用户想改变显示方式时我们都不得不重新发送它们.如果使用了XML的话,数据保存在浏览器中,我们可以非常轻松地改变这些数据的表现形式.
  
  
  使用XSL,你只要简单地改变一下显示形式的描述,就可以实现针对任何一个XML数据的多种的表现形式.你不用每页都重新引入那些数据.而针对数据的更新将自动地在你的数据的表现形式上体现出来.如果你以前从事过面向对象的编程或者学习过模型设计,你会发现这一点跟举世公认的Model-View-Controller模式一样