如何使用C#与XML创建动态分层菜单

GZU521.COM学习网


本文将介绍一种应用程序,它使用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:
然后,将样式表文件和 javascript文件包含在文件的 代码区中。最后,在 asp.net 页面底部的代码用来引用上面提到的createmenu() 方法与walktree()方法,请看list 4。
在asp.net 页面中所找到的c# 代码只是建立了到不同的xml文档的路径,并且对 xmlmenu 类进行了例示。一旦对这个类进行了例示,就对 createmenu()方法进行调用。这个方法接收菜单名以及到这个菜单的xml文档的文件路径。在本例中,要创建3个名为menu1、 menu2和 menu3 的菜单,然后在一个asp.net页面中使用。这个应用程序在一个给定页面中可以支持无穷多的菜单,但是我们建议菜单数目不要过多,因为每增加一个菜单,发送到客户端的文件规模都会增加。
编译 c# 文件
现在我们已经看到了菜单应用程序的结构,接下来讨论一下使用哪些开关可以将c# 文件编译到一个集合中。在 .net sdk 文档中,我们可以查询到一个所有编译开关的完整列表。
要想正确地编译 c# 文件以使它能用于一个asp.net 页面中,编译器就必须要知道包含了system.xml 集合。这可以通过使用 /r 开关并在后面加上到集合的完整路径来完成。由于将要创建的 dll是一个库,因此就必须指定 /t开关,这样编译器就不再寻找一个静态的 main() 方法。最后一个需要的开关是 /out ,它将告诉编译器输出的文件名是什么,以及将其放在哪里

所有对 c# 编译器的调用都以 csc (c# 编译器)开始,然后指定适当的开关。编译器语法的最后一部分包括到已创建的 .cs 文件的路径。请看下面的编译文件的完整语法格式:
 c:\>csc /r:system.xml.dll /

 t:library /out:d:\inetpub\wwwroot\

 xml\bin\xmlmenus.dll d:\inetpub\

 wwwroot\xml\menus\xmlmenus.cs


这行命令告诉编译器包含 system.xml 集合、将文件作为一个库进行编译、将文件输出到 bin目录中、输入文件命名为xmlmenus.cs,输出文件名叫xmlmenus.dll。当输入回车键后,.cs文件就进行编译,生成的 dll将被放置在适当的文件夹中。
结束语
本文通过讲解一个应用程序的思路及实现代码,使我们对于使用microsoft .net平台中的一些集合和类有了一个很好的了解。随着进一步的学习,我们将看到,还会有其它一些集合和类可以以多种方式与本地和远程xml文档一起工作。
本文来自学习网(www.gzu521.com),原文地址:http://www.gzu521.com/campus/article/program/200901/182625.htm

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值