热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

用C#与XML创立动态分层菜单

从在复杂的B2B交易中的交换数据到为利用程序供给配置文件结构,XML在很多方面大显身手!由于XML不断地获得软件的支撑,我们完整能够预感:XML的利用将不断增加。本文就先容这样一
从在复杂的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# 文件


推荐阅读
  • 通过自定义 `TextView`,实现了在用户点击或焦点变化时动态调整字体颜色的效果。该方法利用了 `ColorStateList` 和 `Selector` 资源文件,确保了界面交互的流畅性和视觉效果的提升。具体实现中,通过重写 `onTouchEvent` 和 `onFocusChanged` 方法,精确控制了颜色变化的时机和状态。此外,还对性能进行了优化,确保在高频率操作下依然保持高效响应。 ... [详细]
  • 解决基于XML配置的MyBatis在Spring整合中出现“无效绑定语句(未找到):com.music.dao.MusicDao.findAll”问题的方法
    在将Spring与MyBatis进行整合时,作者遇到了“无效绑定语句(未找到):com.music.dao.MusicDao.findAll”的问题。该问题主要出现在使用XML文件配置DAO层的情况下,而注解方式配置则未出现类似问题。作者详细分析了两个配置文件之间的差异,并最终找到了解决方案。本文将详细介绍问题的原因及解决方法,帮助读者避免类似问题的发生。 ... [详细]
  • 本文详细探讨了Java集合框架的使用方法及其性能特点。首先,通过关系图展示了集合接口之间的层次结构,如`Collection`接口作为对象集合的基础,其下分为`List`、`Set`和`Queue`等子接口。其中,`List`接口支持按插入顺序保存元素且允许重复,而`Set`接口则确保元素唯一性。此外,文章还深入分析了不同集合类在实际应用中的性能表现,为开发者选择合适的集合类型提供了参考依据。 ... [详细]
  • 作为140字符的开创者,Twitter看似简单却异常复杂。其简洁之处在于仅用140个字符就能实现信息的高效传播,甚至在多次全球性事件中超越传统媒体的速度。然而,为了支持2亿用户的高效使用,其背后的技术架构和系统设计则极为复杂,涉及高并发处理、数据存储和实时传输等多个技术挑战。 ... [详细]
  • 如何将PHP文件上传至服务器及正确配置服务器地址 ... [详细]
  • 当前,众多初创企业对全栈工程师的需求日益增长,但市场中却存在大量所谓的“伪全栈工程师”,尤其是那些仅掌握了Node.js技能的前端开发人员。本文旨在深入探讨全栈工程师在现代技术生态中的真实角色与价值,澄清对这一角色的误解,并强调真正的全栈工程师应具备全面的技术栈和综合解决问题的能力。 ... [详细]
  • 深入解析Tomcat:开发者的实用指南
    深入解析Tomcat:开发者的实用指南 ... [详细]
  • 可转债数据智能抓取与分析平台优化
    本项目旨在优化可转债数据的智能抓取与分析平台。通过爬取集思录上的可转债信息(排除已发布赎回的债券),并结合安道全教授提出的三条安全线投资策略,新增了建仓线、加仓线和重仓线,以提供更精准的投资建议。 ... [详细]
  • JVM参数设置与命令行工具详解
    JVM参数配置与命令行工具的深入解析旨在优化系统性能,通过合理设置JVM参数,确保在高吞吐量的前提下,有效减少垃圾回收(GC)的频率,进而降低系统停顿时间,提升服务的稳定性和响应速度。此外,本文还将详细介绍常用的JVM命令行工具,帮助开发者更好地监控和调优JVM运行状态。 ... [详细]
  • 在Spring框架中,基于Schema的异常通知与环绕通知的实现方法具有重要的实践价值。首先,对于异常通知,需要创建一个实现ThrowsAdvice接口的通知类。尽管ThrowsAdvice接口本身不包含任何方法,但开发者需自定义方法来处理异常情况。此外,环绕通知则通过实现MethodInterceptor接口来实现,允许在方法调用前后执行特定逻辑,从而增强功能或进行必要的控制。这两种通知机制的结合使用,能够有效提升应用程序的健壮性和灵活性。 ... [详细]
  • 如何在Windows 7旗舰版中高效打开CHM帮助文件
    如何在Windows 7旗舰版中高效打开CHM帮助文件 ... [详细]
  • 本文深入解析了 Apache 配置文件 `httpd.conf` 和 `.htaccess` 的优化方法,探讨了如何通过合理配置提升服务器性能和安全性。文章详细介绍了这两个文件的关键参数及其作用,并提供了实际应用中的最佳实践,帮助读者更好地理解和运用 Apache 配置。 ... [详细]
  • 题目描述非常吸引人。每颗星星可以通过其在窗口的左下角和右上角位置构建两条扫描线,从而将问题转化为区间增减和求最大值的操作。需要注意的是,位于边界的星星不应计入结果,因此在处理时应分别对左右边界进行适当的增减调整。此外,利用线段树和离散化技术可以显著提高算法效率,确保在大规模数据下的性能表现。 ... [详细]
  • Vuex 实战进阶:构建高效笔记本应用(第二篇)
    在上一篇文章中,我们初步探讨了 Vuex 在该项目中的应用。本文将深入解析整个项目的架构设计。首先回顾 `main.js` 的内容,然后重点分析 `App.vue` 文件,其中引入了 `Toolbar.vue` 和 `NodeList.vue` 组件,详细说明它们在应用中的作用和交互方式。通过这些组件的协同工作,我们将展示如何构建一个高效且响应迅速的笔记本应用。 ... [详细]
  • Jenkins学习精华:自动化构建与持续集成入门指南
    本文综合了网络资源及同事分享的PPT内容,详细介绍了Jenkins在自动化构建与持续集成中的应用。首先涵盖了Jenkins的安装与配置流程,接着阐述了如何根据项目需求设定自动化编译任务,包括确定开发环境、选择合适的编译工具以及实现代码的自动更新等关键步骤。特别强调了在SVN环境中通过命令行实现代码自动拉取的最佳实践。 ... [详细]
author-avatar
蓝羽月妞妞
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有