xml(extansible markup language,可扩展标记语言)是一套用来标记文档的语法,它和现在的web标记语言html相同,都是由sgml发展而来(由于sgml过于求大、求全,未能广泛应用), 同样由w3c(world wide web consortium万维网联盟)制定标准。其目标是统一未来跨平台数据交换的格式,并取代现有的html成为下一代web页的标准。
xml和html都采用标记来表示数据,但本质上却完全不同。html标记由w3c管理,只有w3c能够定义、扩展和管理这些标记,因此,如果自定义的标记不被w3c承认,也就没有任何价值。同时,html本身不能帮助理解或管理数据,例如,要从html文本中提取有效数据完全凭借人类的思维,我们无法编写这样的程序,让它从关于书本的html文本中获取作者的名称。因为有的作者可能用<div>表示,有的可能被<layer>包含,html并未对如何表示一个作者制定规范,因而没法让程序理解哪个标记包含作者,哪个没有。
xml正好相反,它的标记是可自定义的、可扩展的和可识别的。例如,我们可以在关于书籍的xml文本中,定义<name>标记为书本的作者,只要遵循相应的dtd(document type define,文档类型定义),那么任何来源的xml文本,其<name>元素都可以被正确识别,这在html是无法实现的。更重要的是,理论上任何应用都可以识别并处理这些数据,如web浏览器、wap手机、数据库系统或任何其它传统软件,只要它们能够理解并遵守dtd规范就都可以。最后,依照每个应用的需要,可以根据实际情况创建更多标记,或赋予标记不同的含义。如前面的<name>,在介绍书本的文档中可以是作者,在介绍古董的文档中可以是古玩的名称,在学习化学的文档中可以是化学元素,完全可以根据需求来处理,并且能够保证不被混淆。
另外,xml比html更加严格。它不允许出现不配对的标记,如常用的回车符<br>,在xml中,要么是<br/>,要么是<br></br>。也不允许标记的堆叠,如<td><form></td></form>,而且xml区分大小写。最后,xml文档有且仅有一个根元素。
xml可以应用到web,但不限于web,就像我们看到的那样,通过xml最终在前所未有的范围内,实现统一的数据格式规范和完善的处理方法。
由于xml的可扩展标记非常灵活,能够正确解析它的浏览器非常稀少。现有的xhtml做出了尝试,它是一种比xml更加严格的超文本标记语言,但它毕竟还是属于固定标记的文档,在数据交换中还不能和xml相提并论。正是由于目前的浏览器对xml的支持不够,造成xml在web中的应用受到了严重限制,因此,将xml应用到web必须采用其它的手段。目前,被广泛应用的主要包括w3c自己制定的xsl和一些服务器端脚本,如php、jsp等。下面谈谈这些web中的xml应用方法,希望能够达到抛砖引玉的目的。
xml与xslt
首先,我们来看看由w3c制定的xml转换标准?xsl(extansible style language,扩展样式表语言)。它的作用就是让xml看上去像现有的html一样多姿多彩。在此基础上,发展了三种xml应用:xslt、xpath和xsl-soxslt(xsl transformation)负责将xml文档动态地转换为html格式,并发送给浏览器。后两种也具备类似功能,由于应用不及xslt广泛,就不再介绍。
要使用xslt,必须在xml文档中指出。例如,要使一篇xml文档被浏览器请求时呈现类似于html的效果,必须在xml文档前面指定相应的xsl文件,如下所示:
| <?xml version=“1.0”> <?xml-stylesheet type=“text/xml” href=“../xslt/normal.xsl”> <article> <name>whoami</name …… xml 数据 …… </article> |
在相应路径中,应当有一个合适的normal.xsl文档。
xslt使用模板完成xml到html的转换。例如,想要将文档中的<name>节点提取出来,并显示为加粗字符,这样的xslt可以满足要求:
| // 文件名:normal.xsl <?xml version=“1.0”?> <xsl:stylesheet version=“1.0”xmlnsxsl=http://www.w3.org/1999/xsl/transform> <!-由于ms一贯的作风,该名称空间的定义并不适合ms ie浏览器,它必须使用 xmlnsxsl=http://www.w3.org/tr/wd-xsl,注意区分大小写 //--> <xsl:template match=“/”> <div><style=“font-weight:bold”/> <xsl:value-of select=“article/name”/> </div> <xsl:apply-templates/> </xsl:template> </xsl:stylesheet> |
正像前面说的那样,xml非常严格,xslt作为一种xml应用同样要遵守这种规则,因此,除了前两行以外,所有的标记都必须有对应的结束标记。
当能够识别xslt的浏览器(如ie 5.0及以上)获取这一xml文档后,会调用相应的xsl文档进行解释,那么,xslt是如何工作的呢?它首先创建一个模板,匹配整个文档,然后在其中寻找article/name节点,并用value-of元素输出该值,于是,我们通过浏览器看到的xml文档就是:whoami。
不会显示任何其它xml元素。注意xsl文档中加粗的部分,那些是普通的html文本,只是用来强调我们的输出。
xml与php
由于xslt还没有被广泛支持,所以人们必须采取其它办法进行补充。php较早提供了对xml的支持,而且做得很不错。在讨论php之前,有必要了解服务器端脚本的概念。随着inte.net的发展,大量繁杂的信息与大量不同用户之间的个性化需求令传统静态文本不堪重负。用户只想以自己喜欢的方式查看需要的信息。而普通html文本无法满足这一要求。这样,就产生了类似于数据库?服务器端脚本?客户(代理)的数据模型。用户向脚本提交自己的请求,由服务器端脚本向后台数据库发送相应的查询,并将查询结果进行一定的整理发送给用户。这个过程对用户是透明的,他们永远只看见自己需要的数据,不必关心它如何生成,而且,服务器端脚本可以根据用户的个人喜好,将同样的查询结果以完全不同的形式展现到用户面前。
php正是这样一种工具。由于它的语法和c类似,非常简练,又兼具perl、asp的优点,并拥有强大的文件、数据处理及数据库访问能力,而且具备跨平台特性,很快便成为热门的服务器端脚本。php作为用户与数据间的桥梁,根据用户的请求得到所需的数据,再以用户要求的形式返回。
目前版本的php能够通过expat引擎提供对xml的支持,这是一个基于字节流的解析器。如果不敢确定,做一个只包含phpinfo()函数的php页面,由www端口访问它,看看其中的xml项是否有效。
这样,基于php在现代web设计中的位置,它可以一方面方便、快速地解析后台xml文档,另一方面将纯粹的html显示到浏览器中,完全不用担心浏览器是否支持xml,同时获得了数据的完整性和可用性。而在此之前,不得不将数据转换为html,或者用一大堆语句、正则表达式去提取html中一点点有用的东西。
php首先通过xml_parser_create()函数建立一个xml文档解析器,然后由这个解析器注册三个回调函数,分别用于开始标记、结束标记和数据的解析。初始化工作完成后,开始读取xml数据,并通过解析器进行解析。在读取完所有的数据以后,才会释放相关资源,并根据要求将数据赋给php变量,这样,php就可以将xml文档以完全不同的形态呈现到用户面前。
结果是xml中的数据依然完整,任何其它应用仍然可以“理解”这篇xml文档,我们也可以用适当的方法大量输出这类文档,由php自动处理。更重要的是,不必担心别人是否理解你的意图,不会因为浏览器的不同而无法正常显示。
xml与jsp
jsp(java server page)与php类似,属于服务器端脚本。从名称就可以看出,它是基于java的,其实就是java在web服务中的实现。因此,它可以使用几乎所有java的特性,这一点,在构建大型n层应用中占有很大的优势。也因为这样,jsp在很多时候都可以利用xml文档的优势,并不局限于web页面的显示。而且java语言本身涉及面非常的广,所以,这里只简单介绍一下jsp作为脚本语言嵌入时的情况。
例如,可以将xml看作jsp文档的模板部分,将二者有机地结合起来。这样,就能够根据客户端的情况,判断如何使用xml,并设置相应的文档类型输出数据。看看下面这个例子:
<%@ tablib uri=“/xsltablib”prefix=“xsl”%> <% …… string xslpath = null; if (request.getheader(“user-agent”).indexof(“msie”) != -1) { response.setcontenttype(“text/xml”); } else{ xslpath=“../xsl/parser.xsl”; response.setcontenttype(“text/html”); } %> …… 标准xml文档 …… |
首先,jsp检查客户端的浏览器类型,如果是ms ie,jsp就直接以xml格式发送这篇文档,inte.net explorer 可以调用默认的xsl显示这篇xml文档。如果是其它浏览器,则调用xslt解析,然后以html格式发送。这样,针对不同的客户端,用同样的数据实现了不一样的服务。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器