国产毛片午夜福利,国产黄网,国产亚洲天堂,97国产精品

  •  
    用C#與XML創(chuàng)建動態(tài)分層菜單
    發(fā)布時間:2005-03-17   瀏覽次數:1185356
    從在復雜的B2B交易中的交換數據到為應用程序提供配置文件結構,XML在許多方面大顯身手!由于XML不斷地獲得軟件的支持,我們完全能夠預見:XML的應用將不斷增加。本文介紹這樣一種應用程序,它使用XML創(chuàng)建類似于Windows開始菜單的分層菜單系統,從而向終端用戶提供更滿意的Web體驗。

      這個應用程序將使用 C#、XML和服務器端Microsoft .Net框架,創(chuàng)建一個 DHTML 結構,IE4 或更高版本的瀏覽器可以操作它并在客戶端動態(tài)顯示。由于我們可以快速地訪問服務器上的XML,并且XML能夠描述層次之間的關系,因此它成為標記“父/子菜單”數據的一個選擇。

      (一個三層菜單系統,可點擊放大)

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

    什么是.Net集合(Assembly)

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

      一個集合需要許多物理文件,如界面、類、資源文件等等,并且創(chuàng)建了關于文件如何一起工作的元數據。集合中還可能包含版本及信息。集合有許多好處,其中之一是可以在ASP.NET應用程序中使用,而無須用regsvr32.exe向注冊文件中增加一個類識別號(CLSID)。這樣以來,集合的升級操作與將適當的集合復制到一個ASP.NET 應用程序的bin 目錄中一樣簡單,F在我們來仔細看一看那些建立在System.Xml名稱空間和集合中的類。

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

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

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

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

    XML 代碼

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

    我們在List 1的代碼顯示了用來標記單獨菜單項目的XML文檔的一部分。文檔中的主元素命名為menuItem,它可以包含一個名字和超級鏈接元素以及額外的menuItem 子元素。這種關系可以用來創(chuàng)建包含子菜單的菜單系統,象Windows的開始菜單一樣。

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

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

      using System;

      using System.Xml;

      using System.Collections;

      using System.IO;

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

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

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

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

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

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

      <%@ Import Namespace="XmlHierMenu" %>

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

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

    編譯 C# 文件

      現在我們已經看到了菜單應用程序的結構,接下來討論一下使用哪些開關可以將C# 文件編譯到一個集合中。在 .Net SDK 文檔中,我們可以查詢到一個所有編譯開關的完整列表。

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

      所有對 C# 編譯器的調用都以 csc (C# 編譯器)開始,然后指定適當的開關。編譯器語法的一部分包括到已創(chuàng)建的 .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文檔一起工作。

    來源:http://edu.chinaz.com
    立即預約