用C#與XML建立動態分層菜單

來源:互聯網
上載者:User
          從在複雜的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# 檔案
   現在我們已經看到了菜單應用程式的結構,接下來討論一下使用哪些開關可以將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文檔一起工作。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.