One Day-XML:Overview

XML介绍 XML基础规范

    XML全名是可扩展标记语言,是W3C国际标准组织规定的一种基于文本的数据存储格式,它是从IBM的SGML技术派生的,HTML也是从SGML派生的。SGML内容非常复杂,而XML使用了SGML的20%的语法实现了SGML的80%的功能。

    从软件开发人员的角度看, XML语法主要有

  1. XML是国际标准,绝大部分软件厂商,开发工具和编程语言都支持相同的基本XML规范。XML文档可用于任何开发平台上,这是XML技术最大的优势。相对来说,JAVA这种非国际标准的技术跨平台则是不太容易的。
  2. XML是基于纯文本的,XML文档中是不能包含二进制数据。而且存储文件时会涉及到文本编码格式的问题。
  3. XML文件具有层次结构,其中使用一对尖括号来定义一个XML元素,一个XML元素可以包含若干个属性,而XML元素下面可以包含若干个子XML节点。
  4. 一个XML文档只能而且必须定义一个根元素,不可多定义,也不能不定义。
  5. XML元素不能错乱套嵌定义,比如“<a><b></a></b>”是错误的XML文档。
  6. XML格式是为了各系统交流数据而设计的,其设计过程考虑了方便的数据的临时存储和交流,而不考虑数据的长期存储,因此XML文档比较冗余,文件体积大,因此不适合存储大数据量,网络传输效率低。在软件开发中需要注意到这个问题。
XPath

    XPath是W3C国际标准组织提出的在一个XML文档中快速检索和定位XML节点的标准。

XSLT

    XSLT也是W3C国际标准组织在XML标准的基础上提出的XML文档转换的标准,它是一种非常重要的XML应用,它也是跨平台的,受到众多软件厂商的支持。

DOT.NET框架对XML的支持

    .NET框架提供了对XML的强大支持,而且.NET框架本身也普遍采用XML格式来存储各种配置信息。比如web.config文件。

    在.NET类库中,名称空间System.Xml下面就包含了大量的操作XML文档的类型。这些类型构成了两种XML文档的处理模型。

流式处理模型

    在流式处理模型中,我们将XML文档做作一个数据流来进行处理,我们将逐个处理XML文档中的数据,在这种模型下,我们可以只读的快速读取大体积的XML文档,而且内存占用少,程序性能好。类型System.Xml.XmlReader就提供了流式处理模型,使用XmlReader就可以快速读取XML文档。

    使用流式处理模型是有缺点的,首先是它只能读取XML文档,不能修改XML文档;其次是检索XML文档内容不方便,不能使用XPath技术;而且编程接口比较简单,处理XML文档不够方便。当程序需要比较简单的从XML文档读取数据则可以采用流式处理模型。

DOM处理模型

    在DOM处理模型中,我们首先是使用文档对象模型的思想解析整个XML文档,在内存中生成一个对象树来表述XML文档。比如使用一个XmlElement对象来影射到XML文档中的一个元素,使用XmlAttribute对象来影射到XML文档中的一个属性。这样我们编程操作内存中的对象就影射为操作XML文档。

    使用DOM处理XML文档具有相当大的优点,首先是处理方便,我们可以使用各种编程技巧来处理XML文档对象树状结构,比如可以递归遍历XML文档的一部分或全部,可以向树状结构插入,修改或删除XML元素,可以设置XML元素的属性。

    在DOM模式下,我们可以使用XPath技术在XML文档树状结构中进行快速检索和定位,这为处理XML文档带来比较大的方便。

    在C#中,我们可以很简单的使用DOM方式处理XML文档。我们首先实例化一个System.Xml.XmlDocument类型,调用它的Load方法既可加载XML文档并生成XML节点对象树状结构,然后我们就可以遍历这个对象树,新增修改和删除节点,而且其中的任意一个节点都可以使用SelectNodes或SelectSingleNode方法通过XPath相对路径快速查找其它的节点。

    在名称空间System.Xml下面大部分类型都是用来支持DOM处理模型的。其中很多类型配合起来共同组织成XMLDOM,XMLDOM是一种很典型的文档对象模型的应用。文档对象模型是一种比较高级的软件设计模式,我会在今后的课程中详细介绍文档对象模型这种软件设计模式。

System.Xml名称空间下的支持DOM的类型主要有

    XmlNode 是DOM结构中的所有类型的基础类型,它定义了所有XML节点的通用属性和方法,是XMLDOM的基础。它具有一个ChildNodes属性,表示它所包含的子XML节点。

    XmlAttribute 表示XML属性,它只保存在XmlElement的Attributes 列表中。

    XmlDocument表示XML文档本身,是XMLDOM模型中的顶级对象,它用于对XML文档进行整体的控制,并且是其它程序访问XML文档对象树的唯一入口。

    XmlLinkedNode在XmlNode的基础上实现了访问前后同级节点的方法。

    XmlElement元素表示XML元素。是XMLDOM中使用最多的对象类型。它具有Attributes属性可以处理它所拥有的属性,可以使用ChildNodes属性获得它所有的子节点。并提供了一些添加和删除子节点的方法。

    XmlCharacterData表示XML文档中的字符数据的基础类型。字符文本数据是分布在各个XMLElement之间的纯文本数据。XmlAttribute中的文本数据是不属于XML文本块的。

    XmlCDataSection 表示XML文档中CData节,CData数据是采用”<![CDATA[     ]]>”包括起来的纯文本数据。由于XML采用尖括号进行标记,因此具有和HTML类似的转义字符,在一般的XML纯文本段中若遇到尖括号等特殊字符时需要使用转义字符,当文本段中包含大量的这类特殊字符时,手工书写和察看XML文档将比较困难,为了改善XML文档的可读性,在此可以使用CDATA节。在CDATA节中,所有的字符,包括特殊字符都不需要转义,这样察看和修改XML文档都比较方便。

    XmlComment表示一段注释,XML注释和HTML注释一样,使用一对”<!--   -->”来包含起来。

    XmlText表示一段纯文本数据。

    XmlWhitespace表示XML文档中一段纯粹由空白字符组成的文本块,空白字符包括空格,制表符,换行和回车符,全角空格不属于空白字符。XmlDocument在解析XML文档时会处理空白字符,当XmlDocument对象的PreserveWhiitespace属性为true时,会为XML文档中的纯空白文本块生成XmlWhitespace对象,若该属性为false时,则会忽略掉纯空白文本,不会生成XmlWhitespace对象,好像原始的XML文档中不存在这样的空白文本块一样。

其它处理模型

    除了流式处理模型和DOM处理模型外,还存在一些比较另类的使用比较少的处理模型,在此简单介绍一下

DBDOM

    DBDOM是一种基于数据库的XML文档处理模型,它是一个开源项目。它采用大量的存储过程和数据库操作,将一个个XML元素,XML属性等信息保存到数据库的字段中。使用关系型数据库来模拟实现XML的树状结构。我对这个模型也不甚了解,只是知道大概的原理。

BinaryXML

    DOM方式处理XML文档是需要消耗大量的内存的,在处理大型XML文档时,DOM方式会比较大的影响应用系统的性能的。为此有人开始提出BinaryXML的处理模型。在这个模型中,XML文档是当作二进制数据加载到内存中,然后解析文档,使用大量的指针来指向XML文档中的关键位置,通过指针可以快速定位XML文档,能修改XML文档,并能提供类似DOM的编程接口。这种方式能大大节省内存,所消耗的内存仅比XML文件大小稍微大些。但实际运行效果我也不清楚。

 

XMLWEB开发的意义

    XML技术对WEB开发具有重大意义。若要开发高水平的WEB系统,应当好好使用XML技术。

XML和HTML

    XML和HTML都源自SGML,具有相同的来源,而且两者都是采用尖括号的标记语言,两者具有很大的相似性。使用XML完全可以模拟出HTML,而且W3C提出了现代WEB站点应当采用的XHTML标准就是XML和HTML的结合。

    在使用ASP.NET开发WEB系统中,除了使用ASP.NET控件展示数据外,还需要由程序拼凑出大量的HTML代码来展现数据。简单的进行字符串连接操作来生成HTML页面不是一种可持续性的软件开发和维护的过程。程序代码很容易杂乱无章,生成的HTML代码可读性不好。若在生成HTML代码的过程借鉴XML技术则有助于改善这种问题,从而能更好的控制WEB软件的开发过程,提高软件质量。

XML和WebService

    WebService基础就是XML,WebService的原理是将编程对象序列化成一个XML文档,然后通过HTTP协议传递给客户端,客户端接受这个XML文档,通过反序列化重现编程对象。因此WebService的基础就是XML序列化技术。在开发和调试稍微复杂的WebService是需要一定的XML技术基础。

Ajax技术的底层也是使用XML来传递数据的,可以看作一种特殊的WebService。可以这样比喻,WebService是WEB系统的公开方法,而Ajax则是私有方法。

XML/XSLT提供一种全新的开发模式

    XML/XSLT两项技术的配合可以提供一种全新的WEB系统开发模式。在这种模式下,页面将需要显示的纯粹的数据组织生成一个XML文档,并配上XSL转换信息头,然后发送到客户端,在客户端IE浏览器接受解析XML文档,根据其中的XSL转换头信息再下载XSLT文档,执行XSLT转换,然后才显示转换的结果。此时WEB页面既能正常的使用指定的格式显示数据,而且本身就是一个可供其它程序调用的WebService。该页面的输出的源代码就是XML文档,而且只有IE等浏览器类型软件才处理XSLT转换信息头,其他程序是会忽略掉这个信息的。此时页面具有双重功能,便于代码的集成开发和维护。


XPath介绍

    XPath是从XML基础规范上派生的技术,专门用于快速检索和查询XML文档,使用方便,功能强大,XPath也是XSLT技术的基础。

    XPathW3C国际标准组织定义的用于在单个XML文档中快速检索和定位XML文档节点的规范,它也是跨平台的,若一些软件支持XPath,则必然是支持标准的XPath语法。因此无论是JAVA还是C#都是支持相同语法的XPath

    我们理解XPath时可以参考文件目录结构FilePath,在Windows资源管理器左边的文件目录树状列表中,可以看到各种文件对象,包括磁盘根目录,各级文件目录等等,它们共同构成了一个树状结构,我们选择对象时既可以在这个树状结构中一个个查找,也可以指定路径名来进行快速定位,文件系统的路径名采用斜杠号来分隔各个目录层次的目录名。比如在这个示意图中,我们选中的目录,可以使用路径名c:\documents and settings\袁永福来快速定位。

    而XML文档中也是这种树状层次结构,因此我们也可以套用这种文件路径名的概念到XML文档中,于是形成了XPath路径。我们处理XML文档时可以一层层查找所需的XML节点,也可以指定XPath路径字符串来快速定位XML节点。在XPath路径中,我们使用反斜杠符号来分隔各个层次的XML元素的名称。

    在文件目录系统中,我们可以可以使用绝对路径名,也可以使用相对路径名,我们可以使用一个点号表示当前目录,使用两个点表示父目录。在XPath中我们也套用了类似的概念,我们从XML文档根节点出发而指定的XPath路径为绝对路径,从某个XML节点开始转到其它节点所经过的路径为相对路径,我们也使用一个点表示当前节点,也使用两个点来表示父节点。其实我们可以将绝对路径看成从根节点出发的相对路径。

    在这个示意图中,第一个选中的节点可以使用XPath路径“Table/Record/Country”来快速定位。

    在文件目录系统中,同一个目录下面不能有相同名称的对象,因此相对路径名和绝对路径名都能准确的定位到一个目录上,而在XML文档中,同一个XML节点下可以存在多个具有相同名称的子节点,因此XPath路径可能无法唯一的确定一个XML节点。此时XPath采用了内嵌条件判断语句的方法来解决这个问题。XPath路径字符串中可以使用一对方括号来包含一个逻辑表达式,在这个表达式中可以使用字符串判断,数学四则运算,逻辑判断和一些预定义函数,而且XPath路径中每个层次都能包含表格式,因此XPath的逻辑判断的功能是非常强大的。

    在示意图中,我们使用XPath路径Table/Record[CustomerID=’ANATR’]/Phone来快速定位第二个节点,此处使用了一段方括弧包含了一个逻辑表达式。表示查找某个节点,该节点下的CustoemrID子节点的文本值等于 “ANATR”

    XPath是一种国际标准,但在微软的.NET框架当然支持这个国际标准。我们可以使用.NET类库中的System.Xml.Xsl.XslTransform类型来执行XSLT转换。这个类型除了支持标准的XPath外,还进行一些扩展,主要是能扩展使用开发者自己定义的函数。

    使用XPath,我们可以很方便的搜索XML文档中的任何部分,因此具有很好的数据检索分析功能,近期业界兴起的半结构化文档技术大多就是以XPath为基础的。

    由于XPath技术是相当强的,而且是国际标准,跨平台的,因此大家有时间好好学习使用它。对于XPath的详细语法可访问网站 http://www.w3.org/TR/xpath ,若大家安装了MSDN2003版,也可参考 MSDN Library/XML Web Services/XML核心/SDK 文档/MSXML4.0 SDK/XPath Reference。这些电子文档全是英文,大家也可以购买一些专门讲述XML技术的中文书籍看看。

 

XSLT介绍

    XSLT是一种将XML文档转换为其他文本文档的语言,是建立在XMLXPath之上的国际标准,内容比较多,功能强大。

    对于编程人员来说,XSLT可以看作以前序遍历的方式专门处理XML树状结构的标记语言。以前编程根据XML文档输出纯文本数据时需要写代码以前序遍历方式的方式遍历XML文档对象组成的树状结构,对于每一个特定名称或特定层次的XML节点而输出不同的内容,这个过程比较复杂,代码量大,需用进行很多的状态判断。而XSLT则使用一种简洁明了的标记语言实现了相同的逻辑。因此XSLT从程序逻辑的角度看类似支持递归的编程语言,而且是专门处理XML文档的。

    XSLT转换过程会涉及到三个文本文档,一个是要处理的原始XML文档,第二个就是XSLT样式表文档,该文档包含了XSLT代码,XSLT代码本身就是XML格式,但使用了XML的名称空间。第三个就是XSLT处理输出的文本文档,注意,此处输出的是纯文本文档,这个文档具体是什么格式完全靠XSLT代码来决定,可以是另外一个XML文档,HTML文档,SQL语句字符串或者其他任意格式的字符串数据等等,XSLT转换只能输出纯文本文档,此外就没有限制输出文档的具体格式。

XML/XSLTWEB开发中的应用

    XML/XSLT技术在WEB开发中可以发挥很大的应用,可以为WEB开发提供一种新的HTML页面生成方式。

    一般的在WEB开发中使用XML/XSLT技术主要有两种模式,一个是在服务器端执行XSLT转换,另一个是在客户端执行XSLT转换。

    在服务器端执行XSLT转换时,应用系统的业务模块生成包含要显示的数据的XML文档,然后调用事先写好的XSLT模板文档,执行XSLT转换,转换结果一般是HTML文档,当然也可以是其他类型的文本文档,此时客户端就可以将生成的HTML文档直接作为页面响发送到客户端浏览器中。客户端浏览器接受HTML文档并显示出来。在这个过程中,服务器端生成的XML文档,XSLT转换生成的HTML文档都是临时生成的文档,都可以存留在内存中,用完即可清除掉,不需要写到磁盘文件中。

    在客户端执行XSLT转换时,应用系统的业务模块生成包含要显示的数据的XML文档,加上XSLT转换信息标记,直接发送到客户端浏览器,客户端浏览器获得这个XML文档,根据其中的XSLT转换信息标记,从服务器上下载指定名称的XSLT文档。然后调用自己的XSLT转换器进行转换,在内存中生成了HTML文档并显示出来。此时显示的HTML页面不会出现在浏览器的缓冲文件夹中,也看不到HTML源代码,只能看到XML的源代码。

    由于XSLT转换是国际标准,在服务器端的转换结果和在客户端的转换结果是一样的。因此两种模式下浏览器中显示的页面内容是一样的。

  在传统的WEB开发中,我们都是直接使用业务系统拼凑出HTML字符串来生成要显示的HTML页面。虽然在ASP.NET中大量使用Web控件来简化开发,但web控件内部还是拼凑HTML字符串的。使用程序代码来拼凑HTML字符串会影响程序代码的可读性,很容易使得程序代码杂乱无章,而且生成的HTML可读性差。

    若使用XML/XSLT技术则可以有效的改善这种情况,由于XML文档格式检查非常严格,因此这就使得程序代码生成XML文档过程准确,不得出现错误,在这个环境下迫使程序员注意保持程序代码质量。而且生成的XML文档不只用于生成HTML页面,还能方便的向其他程序模块提供数据,并可充当WebService

    考察WEB应用中生成的HTML代码,可以发现,大量的HTML页面中用于实现页面各种动态效果和页面格式的HTML代码多于直接显示数据的HTML代码,而且HTML代码普遍重复。这使得HTML页面代码臃肿,文件大,这会使得客户端浏览器下载页面缓慢。当采用XML/XSLT技术并在客户端执行XSLT转换时,由于服务器端发送的XML文档非常简洁,只包含纯粹的数据,并没有其他冗余的代码,因此文档小,下载快。与之配套的XSLT模板也是经过分析处理的,代码重复少,因此XSLT文件也小,这样客户端浏览器以前要下载一个很大的HTML文档,而现在只要下载两个较小的文档,这缩短了浏览器下载数据的时间。

    除了改善数据传输过程,浏览器自己执行XSLT转换,这样能将一部分的工作量从服务器端转移到客户端,此时服务器端只要快速生成包含数据的XML文档即完成工作。由于XSLT是广泛采用的国际标准,此时WEB系统能可靠的使用客户端的运算能力,从而减少服务器端运算压力,而利用客户端长期闲置的运算能力。

    虽然XML/XSLT技术具有很大的优势,但在实际开发中仍然存在不小的问题,其中最大的问题就是编制XSLT模板文件成本高。我们在开发WEB系统中使用了很多开发工具,包括VS.NETWEB窗体设计器,美工人员使用的FrontPageDreamwave等等,都是用于生成HTML文档的,而HTML文档要求不严格,很多内容还不符合XML规范,因此需要使用各种方法将这些HTML文档转换为标准的XML文档,然后还需要分析页面结构,将这些XML文档加工成XSLT文档。在目前的技术条件下,这个过程成本比较大,使得XML/XSLT技术难于推广和普及。在此建议大家多多思考,如何低成本的将HTML文档转换为XSLT文档。

    而且XML/XSLT技术调试比较困难,对开发者要求很高,这也加大了这个技术的应用成本。而且目前的web系统中大量使用的WEB控件没有考虑到XML/XSLT技术,这也阻碍了这种新技术的应用。 

 

 

ref:http://www.cnblogs.com/xdesigner/archive/2008/05/15/1198398.html 

posted @ 2010-04-10 12:03  Freedom  阅读(163)  评论(0编辑  收藏  举报