从在复杂的B2B交易中的交换数据到为利用程序供给配置文件结构,XML在很多方面大显身手!由于XML不断地获得软件的支撑,我们完整能够预感:XML的利用将不断增加。本文就先容这样一种利用程序,它应用XML创立类似于Windows开端菜单的分层菜单系统,从而向终端用户供给更满足的Web体验。
这个利用程序将应用 C#、XML和服务器端Microsoft .Net框架,创立一个 DHTML 结构,IE4 或更高版本的浏览器可以把持它并在客户端动态显示。由于我们可以快速地拜访服务器上的XML,并且XML能够描写层次之间的关系,因此它成为标记“父/子菜单”数据的一个最佳选择。
(一个三层菜单系统,可点击放大)
除了学习如何应用XML创立一个菜单利用程序外,我们还要先容 .Net框架的重要 XML 类,它们位于 System.Xml 聚集中。
什么是.Net聚集(Assembly)
要在 C# 文件中应用XML,就必需引用一个特定的名称空间。 .Net平台中的一个名称空间是作为一个程序组件的组织系统应用的,它对于解决命名冲突很重要,这一点很象 XML中的 名称空间。这个基于 XML的菜单系统是用位于System.Xml聚集中的System.Xml名称空间创立的。.Net SDK 是这样定义聚集的:一个聚集就是一个类型和资源的汇集信息,这些类和资源一起应用,形成一个功效的逻辑单元,即一个“逻辑”dll。
一个聚集需要很多物理文件,如界面、类、资源文件等等,并且创立了关于文件如何一起工作的元数据。聚集中还可能包含版本及安全信息。聚集有很多利益,其中之一就是可以在ASP.NET利用程序中应用,而无须用regsvr32.exe向注册文件中增加一个类辨认名(CLSID)。这样以来,聚集的升级把持与将适当的聚集复制到一个ASP.NET 利用程序的bin 目录中一样简略。现在我们就来仔细看一看那些建立在System.Xml名称空间和聚集中的类。
假如你以前应用过Microsoft的 MSXML3分解器,就会发明应用System.Xml 聚集中的类相当简略。这里的菜单利用程序只应用了这些重要聚集类中的一部分:XmlNode、 XmlDocument、 XmlNodeList、 XmlNamedNodeMap、 DocumentNavigator、 XmlTextReader和 XmlTextWriter。
XmlDocument、 XmlNodeList和XmlNode类用来创立传递给客户端浏览器的菜单利用程序的结构。用XmlDocument类以一种安全线程(thread-safe)的方法从服务器上装载和分解本地或远程XML 文档。建立在一个字符串中的 XML标记也可以被装载或分解,从而在一个文档中创立、移动节点或取消节点的移动。XmlNodeList 类可以使我们列举一个节点的聚集来拜访一个特定属性,如名称、值或名称空间。最后,XmlNode类可以用来在XML文档中向一个用于检验的XmlNode 对象分配一个特定节点。
XmlNamedNodeMap类用来列举建立在一个元素类型选择中的属性聚集。 DocumentNavigator、 XmlTextReader和XmlTextWriter类供给与XML一起应用所需要的额外功效。要特别阐明的是,DocumentNavigator可以用来履行XPath查询,它被包含在XSLT转换中。XmlTextReader类供给对XML节点的只向前(forward-only)、无缓存的拜访,从而使XML节点对大型XML文档也同样生效。XmlTextWriter类供给一个快速、只向前的指针模型,实现将 XML 内容写到一个流或一个文件中的目标。
在菜单利用程序中应用的XML 文档相对来说是较小的,因此我们可以在服务器端应用文档对象模式(DOM)来存取XML文档中的不同节点。当分解大型 XML文档时,就需要应用XmlTextReader 类所含有的只向前模型。
XML 代码
菜单利用程序应用了3个 XML 文档:menuItems.xml、menuItems2.xml 和menuItems3.xml,它们用于标记单独的菜单项目。XML的处理和把持由一个叫做xmlMenus.dll的聚集完成,这个聚集被服务器真个一个ASP.NET 文件createMenus.aspx所应用。在客户真个动态HTML (DHTML)内容应用了一个层叠格局表文件和一个Javascript文件,这些文件联合在一起天生了本文开端部分的图示成果。
我们在List 1的代码显示了用来标记单独菜单项目标XML文档的一部分。文档中的主元素命名为menuItem,它可以包含一个名字和超级链接元素以及额外的menuItem 子元素。这种关系可以用来创立包含子菜单的菜单系统,就象Windows的开端菜单一样。
由于 XML已经标出了分层关系,因此就可以利用循环在不同元素之间行走:当应用XmlDocument、XmlNode和XmlNodeList类创立子节点时,我们可以重复调用WalkTree() 函数以颠倒父/子关系。其它的类如 ArrayList和 StreamWriter用于将相干菜单回类到数组中,然后在适当时间将所天生的菜单结构写进一个文件中。
XmlMenus聚集的代码开端时要声明一个XmlHierMenu 名称空间,接下来要引用 System、 System.Xml、 System.Collections和System.IO 名称空间:
using System;
using System.Xml;
using System.Collections;
using System.IO;
在这部分代码之后要创立3个结构器。一个结构器不接收变量,只对变量进行初始化。下一个结构器接收一个图象文件的定制路径。最后一个结构器在不经常对XML菜单进行刷新的情况下,答应将由聚集天生的输出存储到一个文件中。最后一个结构器所天生的文件可以被静态地包含在一个 ASP.NET文件中,而不是在各个Web页面恳求时随时地天生。
在结构器之后,开端定义 CreateMenu()方法,具体请看List 2中的代码。
这个方法负责进行XML文档的装载和解析,找到根节点,然后在根的子节点之间循环。假如发明一个子节点本身还有子节点,就调用WalkTree() 方法,并且把这些子节点都传递到其中。假如这些子节点还有子节点,就再次调用 WalkTree()。这个过程循环进行直到不再发明增加的子节点。Walktree()方法的代码可以参看List 3。
在调用 WalkTree()方法并且对不同的节点进行分析的同时,要解析 menuItem节点,将来自其超级链接和名字节点的数据放在数组列表中。对全部 XML文档都进行解析之后,数组列表的内容就被传递回调用的ASP.NET的页面,然后应用Response对象写出信息。从这时起,客户真个 Javascript代码就开端把持DHTML 菜单了。
在服务器端,我们应用一个 ASP.NET页面来开端菜单的创立过程。这个页面输进了与聚集相干联的名称空间XmlHierMenu:
<%@ page language='C#' %>
<%@ Import Namespace='XmlHierMenu' %>
然后,将样式表文件和 Javascript文件包含在文件的 代码区中。最后,在 ASP.NET 页面底部的代码用来引用上面提到的CreateMenu() 方法与WalkTree()方法,请看List 4。
在ASP.NET 页面中所找到的C# 代码只是建立了到不同的XML文档的路径,并且对 XmlMenu 类进行了例示。一旦对这个类进行了例示,就对 CreateMenu()方法进行调用。这个方法接收菜单名以及到这个菜单的XML文档的文件路径。在本例中,要创立3个名为menu1、 menu2和 menu3 的菜单,然后在一个ASP.NET页面中应用。这个利用程序在一个给定页面中可以支撑无限多的菜单,但是我们建议菜单数目不要过多,由于每增加一个菜单,发送到客户真个文件范围都会增加。
编译 C# 文件