成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何使用C#與XML創(chuàng)建動(dòng)態(tài)分層菜單

開發(fā) 后端
從在復(fù)雜的B2B交易中的交換數(shù)據(jù)到為應(yīng)用程序提供配置文件結(jié)構(gòu),XML在許多方面大顯身手!由于XML不斷地獲得軟件的支持,我們完全能夠預(yù)見:XML的應(yīng)用將不斷增加。本文就介紹這樣一種應(yīng)用程序,它使用XML創(chuàng)建類似于Windows開始菜單的分層菜單系統(tǒng),從而向終端用戶提供更滿意的Web體驗(yàn)。

本文將介紹一種應(yīng)用程序,它使用XML創(chuàng)建類似于Windows開始菜單的分層菜單系統(tǒng),從而向終端用戶提供更滿意的Web體驗(yàn)。

這個(gè)應(yīng)用程序?qū)⑹褂?C#、XML和服務(wù)器端Microsoft .Net框架,創(chuàng)建一個(gè) DHTML 結(jié)構(gòu),IE4 或更高版本的瀏覽器可以操作它并在客戶端動(dòng)態(tài)顯示。由于我們可以快速地訪問服務(wù)器上的XML,并且XML能夠描述層次之間的關(guān)系,因此它成為標(biāo)記“父/子菜單”數(shù)據(jù)的一個(gè)最佳選擇。

 
一個(gè)三層菜單系統(tǒng)

除了學(xué)習(xí)如何使用XML創(chuàng)建一個(gè)菜單應(yīng)用程序外,我們還要介紹 .Net框架的主要 XML 類,它們位于 System.Xml 集合中。

什么是.Net集合(Assembly)

要在 C# 文件中使用XML,就必須引用一個(gè)特定的名稱空間。 .Net平臺(tái)中的一個(gè)名稱空間是作為一個(gè)程序組件的組織系統(tǒng)使用的,它對(duì)于解決命名沖突很重要,這一點(diǎn)很象 XML中的 名稱空間。這個(gè)基于 XML的菜單系統(tǒng)是用位于System.Xml集合中的System.Xml名稱空間創(chuàng)建的。.Net SDK 是這樣定義集合的:一個(gè)集合就是一個(gè)類型和資源的匯集信息,這些類和資源一起使用,形成一個(gè)功能的邏輯單元,即一個(gè)“邏輯”dll。

一個(gè)集合需要許多物理文件,如界面、類、資源文件等等,并且創(chuàng)建了關(guān)于文件如何一起工作的元數(shù)據(jù)。集合中還可能包含版本及安全信息。集合有許多好處,其中之一就是可以在ASP.NET應(yīng)用程序中使用,而無須用regsvr32.exe向注冊(cè)文件中增加一個(gè)類識(shí)別號(hào)(CLSID)。這樣以來,集合的升級(jí)操作與將適當(dāng)?shù)募蠌?fù)制到一個(gè)ASP.NET 應(yīng)用程序的bin 目錄中一樣簡單。現(xiàn)在我們就來仔細(xì)看一看那些建立在System.Xml名稱空間和集合中的類。

如果你以前使用過Microsoft的 MSXML3分解器,就會(huì)發(fā)現(xiàn)使用System.Xml 集合中的類相當(dāng)簡單。這里的菜單應(yīng)用程序只使用了這些主要集合類中的一部分:XmlNode、 XmlDocument、 XmlNodeList、 XmlNamedNodeMap、 DocumentNavigator、 XmlTextReader和 XmlTextWriter。

XmlDocument、 XmlNodeList和XmlNode類用來創(chuàng)建傳遞給客戶端瀏覽器的菜單應(yīng)用程序的結(jié)構(gòu)。用XmlDocument類以一種安全線程(thread-safe)的方式從服務(wù)器上裝載和分解本地或遠(yuǎn)程XML 文檔。建立在一個(gè)字符串中的 XML標(biāo)記也可以被裝載或分解,從而在一個(gè)文檔中創(chuàng)建、移動(dòng)節(jié)點(diǎn)或取消節(jié)點(diǎn)的移動(dòng)。XmlNodeList 類可以使我們列舉一個(gè)節(jié)點(diǎn)的集合來訪問一個(gè)特定屬性,如名稱、值或名稱空間。最后,XmlNode類可以用來在XML文檔中向一個(gè)用于檢驗(yàn)的XmlNode 對(duì)象分配一個(gè)特定節(jié)點(diǎn)。

XmlNamedNodeMap類用來列舉建立在一個(gè)元素類型選擇中的屬性集合。 DocumentNavigator、 XmlTextReader和XmlTextWriter類提供與XML一起使用所需要的額外功能。要特別說明的是,DocumentNavigator可以用來執(zhí)行XPath查詢,它被包含在XSLT轉(zhuǎn)換中。XmlTextReader類提供對(duì)XML節(jié)點(diǎn)的只向前(forward-only)、無緩存的訪問,從而使XML節(jié)點(diǎn)對(duì)大型XML文檔也同樣生效。XmlTextWriter類提供一個(gè)快速、只向前的指針模型,實(shí)現(xiàn)將 XML 內(nèi)容寫到一個(gè)流或一個(gè)文件中的目的。

在菜單應(yīng)用程序中使用的XML 文檔相對(duì)來說是較小的,因此我們可以在服務(wù)器端使用文檔對(duì)象模式(DOM)來存取XML文檔中的不同節(jié)點(diǎn)。當(dāng)分解大型 XML文檔時(shí),就需要使用XmlTextReader 類所含有的只向前模型。

#p#

XML 代碼

菜單應(yīng)用程序使用了3個(gè) XML 文檔:menuItems.xml、menuItems2.xml 和menuItems3.xml,它們用于標(biāo)記單獨(dú)的菜單項(xiàng)目。XML的處理和操作由一個(gè)叫做xmlMenus.dll的集合完成,這個(gè)集合被服務(wù)器端的一個(gè)ASP.NET 文件createMenus.aspx所使用。在客戶端的動(dòng)態(tài)HTML (DHTML)內(nèi)容使用了一個(gè)層疊格式表文件和一個(gè)JavaScript文件,這些文件聯(lián)合在一起生成了本文開始部分的圖示結(jié)果。

我們?cè)贚ist 1的代碼顯示了用來標(biāo)記單獨(dú)菜單項(xiàng)目的XML文檔的一部分。文檔中的主元素命名為menuItem,它可以包含一個(gè)名字和超級(jí)鏈接元素以及額外的menuItem 子元素。這種關(guān)系可以用來創(chuàng)建包含子菜單的菜單系統(tǒng),就象Windows的開始菜單一樣。

由于 XML已經(jīng)標(biāo)出了分層關(guān)系,因此就可以利用循環(huán)在不同元素之間行走:當(dāng)使用XmlDocument、XmlNode和XmlNodeList類創(chuàng)建子節(jié)點(diǎn)時(shí),我們可以反復(fù)調(diào)用WalkTree() 函數(shù)以顛倒父/子關(guān)系。其它的類如 ArrayList和 StreamWriter用于將相關(guān)菜單歸類到數(shù)組中,然后在適當(dāng)時(shí)間將所生成的菜單結(jié)構(gòu)寫入一個(gè)文件中。

XmlMenus集合的代碼開始時(shí)要聲明一個(gè)XmlHierMenu 名稱空間,接下來要引用 System、 System.Xml、 System.Collections和System.IO 名稱空間:

using System;

using System.Xml;

using System.Collections;

using System.IO;

在這部分代碼之后要?jiǎng)?chuàng)建3個(gè)構(gòu)造器。一個(gè)構(gòu)造器不接收變量,只對(duì)變量進(jìn)行初始化。下一個(gè)構(gòu)造器接收一個(gè)圖象文件的定制路徑。最后一個(gè)構(gòu)造器在不經(jīng)常對(duì)XML菜單進(jìn)行刷新的情況下,允許將由集合生成的輸出存儲(chǔ)到一個(gè)文件中。最后一個(gè)構(gòu)造器所生成的文件可以被靜態(tài)地包含在一個(gè) ASP.NET文件中,而不是在各個(gè)Web頁面請(qǐng)求時(shí)隨時(shí)地生成。

在構(gòu)造器之后,開始定義 CreateMenu()方法,具體請(qǐng)看List 2中的代碼。

這個(gè)方法負(fù)責(zé)進(jìn)行XML文檔的裝載和解析,找到根節(jié)點(diǎn),然后在根的子節(jié)點(diǎn)之間循環(huán)。如果發(fā)現(xiàn)一個(gè)子節(jié)點(diǎn)本身還有子節(jié)點(diǎn),就調(diào)用WalkTree() 方法,并且把這些子節(jié)點(diǎn)都傳遞到其中。如果這些子節(jié)點(diǎn)還有子節(jié)點(diǎn),就再次調(diào)用 WalkTree()。這個(gè)過程循環(huán)進(jìn)行直到不再發(fā)現(xiàn)增加的子節(jié)點(diǎn)。Walktree()方法的代碼可以參看List 3。

在調(diào)用 WalkTree()方法并且對(duì)不同的節(jié)點(diǎn)進(jìn)行分析的同時(shí),要解析 menuItem節(jié)點(diǎn),將來自其超級(jí)鏈接和名字節(jié)點(diǎn)的數(shù)據(jù)放在數(shù)組列表中。對(duì)整個(gè) XML文檔都進(jìn)行解析之后,數(shù)組列表的內(nèi)容就被傳遞回調(diào)用的ASP.NET的頁面,然后使用Response對(duì)象寫出信息。從這時(shí)起,客戶端的 JavaScript代碼就開始控制DHTML 菜單了。

在服務(wù)器端,我們使用一個(gè) ASP.NET頁面來開始菜單的創(chuàng)建過程。這個(gè)頁面輸入了與集合相關(guān)聯(lián)的名稱空間XmlHierMenu:

<%@ page language="C#" %>

<%@ Import Namespace="XmlHierMenu" %>

然后,將樣式表文件和 JavaScript文件包含在文件的 代碼區(qū)中。最后,在 ASP.NET 頁面底部的代碼用來引用上面提到的CreateMenu() 方法與WalkTree()方法,請(qǐng)看List 4。

在ASP.NET 頁面中所找到的C# 代碼只是建立了到不同的XML文檔的路徑,并且對(duì) XmlMenu 類進(jìn)行了例示。一旦對(duì)這個(gè)類進(jìn)行了例示,就對(duì) CreateMenu()方法進(jìn)行調(diào)用。這個(gè)方法接收菜單名以及到這個(gè)菜單的XML文檔的文件路徑。在本例中,要?jiǎng)?chuàng)建3個(gè)名為menu1、 menu2和 menu3 的菜單,然后在一個(gè)ASP.NET頁面中使用。這個(gè)應(yīng)用程序在一個(gè)給定頁面中可以支持無窮多的菜單,但是我們建議菜單數(shù)目不要過多,因?yàn)槊吭黾右粋€(gè)菜單,發(fā)送到客戶端的文件規(guī)模都會(huì)增加。

編譯 C# 文件

現(xiàn)在我們已經(jīng)看到了菜單應(yīng)用程序的結(jié)構(gòu),接下來討論一下使用哪些開關(guān)可以將C# 文件編譯到一個(gè)集合中。在 .Net SDK 文檔中,我們可以查詢到一個(gè)所有編譯開關(guān)的完整列表。

要想正確地編譯 C# 文件以使它能用于一個(gè)ASP.NET 頁面中,編譯器就必須要知道包含了System.Xml 集合。這可以通過使用 /r 開關(guān)并在后面加上到集合的完整路徑來完成。由于將要?jiǎng)?chuàng)建的 dll是一個(gè)庫,因此就必須指定 /t開關(guān),這樣編譯器就不再尋找一個(gè)靜態(tài)的 Main() 方法。最后一個(gè)需要的開關(guān)是 /out ,它將告訴編譯器輸出的文件名是什么,以及將其放在哪里。

所有對(duì) C# 編譯器的調(diào)用都以 csc (C# 編譯器)開始,然后指定適當(dāng)?shù)拈_關(guān)。編譯器語法的最后一部分包括到已創(chuàng)建的 .cs 文件的路徑。請(qǐng)看下面的編譯文件的完整語法格式:

 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 集合、將文件作為一個(gè)庫進(jìn)行編譯、將文件輸出到 bin目錄中、輸入文件命名為xmlMenus.cs,輸出文件名叫xmlMenus.dll。當(dāng)輸入回車鍵后,.cs文件就進(jìn)行編譯,生成的 dll將被放置在適當(dāng)?shù)奈募A中。

結(jié)束語

本文通過講解一個(gè)應(yīng)用程序的思路及實(shí)現(xiàn)代碼,使我們對(duì)于使用Microsoft .Net平臺(tái)中的一些集合和類有了一個(gè)很好的了解。隨著進(jìn)一步的學(xué)習(xí),我們將看到,還會(huì)有其它一些集合和類可以以多種方式與本地和遠(yuǎn)程XML文檔一起工作。

【編輯推薦】

  1. 跟MVP學(xué)C#視頻教程
  2. C#必備知識(shí)之預(yù)編譯指令
  3. 使用PHP與XML進(jìn)行網(wǎng)站編程
  4. AJAX和XmlHttpRequest下的Web開發(fā)
責(zé)任編輯:楊鵬飛 來源: PCPPC.CN
相關(guān)推薦

2009-08-19 16:42:41

C#如何使用XML

2009-08-06 16:44:03

C#創(chuàng)建WebServ

2009-08-24 17:24:28

C#創(chuàng)建XML文檔

2009-08-17 15:34:58

C#創(chuàng)建XML

2009-08-24 17:46:54

C#創(chuàng)建XML文檔

2009-08-24 17:34:14

C#創(chuàng)建XML Web

2009-08-21 10:00:43

C#創(chuàng)建XML文件XmlTextWrit

2009-08-18 14:25:05

C# 操作Excel

2009-08-11 13:27:09

C#動(dòng)態(tài)圖像按鈕

2009-08-11 13:27:22

C#創(chuàng)建Web Ser

2009-08-18 11:17:37

C#添加鼠標(biāo)右鍵

2009-09-02 16:14:21

C#動(dòng)態(tài)創(chuàng)建數(shù)組

2009-09-02 16:20:22

C#動(dòng)態(tài)創(chuàng)建數(shù)組

2009-08-12 16:46:22

C#讀取XML文檔

2009-08-18 16:42:49

C# 操作XML

2009-12-02 14:14:06

PHP DOM-XML

2015-09-16 15:11:58

C#異步編程

2009-09-04 14:14:55

C#文檔

2009-09-09 13:57:28

C# XML解析

2009-08-18 16:30:41

C# 操作XML
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产高清视频一区 | 亚洲精品日韩在线 | 免费一区二区 | 欧美精品一区二区三区四区五区 | 中文av网站 | 九九热热九九 | 国产91网站在线观看 | 成人精品在线观看 | 欧美一级片在线播放 | 丝袜 亚洲 另类 欧美 综合 | 乳色吐息在线观看 | 久久久久久久一区 | 日日操夜夜摸 | 亚洲欧美精品在线观看 | 天天干夜夜操 | 国产传媒视频在线观看 | 成人亚洲视频 | 中文字幕中文字幕 | 亚洲福利片 | 精品一区二区三区在线观看国产 | 精品真实国产乱文在线 | 欧美日韩国产传媒 | 亚洲精品免费观看 | 国内久久精品 | 日韩中文字幕在线观看视频 | 九九热这里只有精品6 | 免费观看的av毛片的网站 | 亚洲电影免费 | 欧美在线a | 久久久久国产一区二区三区四区 | 看av电影 | 国产日韩精品一区二区 | 91成人在线 | 中文字幕av高清 | 国产精品久久 | 午夜三级在线观看 | 久久久久久一区 | 欧美日韩美女 | 亚洲最大福利网 | 欧美成人免费在线视频 | 三级免费毛片 |