XML在.net平台下的自訂控制項的應用

來源:互聯網
上載者:User
xml|控制項

 

Xml全稱可延伸標記語言 (XML)(extensible marked language),這套語言系統由於在資料處理,跨平台等方面的獨特優勢,在近幾年風靡全球。Xml語言系統把任何資料都作為“鍵”和“值”來進行處理,這一點類似於很多資料庫管理系統(DBMS),而且它與具體的機器指令無關,其儲存方式是純文字檔案,因此具有出色的跨平台性。另外它允許使用者建立自己的資料指令系統,在這套指令系統的架構下,使用者可以把所有資訊轉換成易於存取的資料,大大加快了開發的周期和代碼的可移植性。
  
    既然XML這麼好,那它到底是什麼樣子的呢?最近筆者因為課題的需要,開發了一個基於.net平台下的menu控制項,並且加入了xml特性。製作的步驟如下:
  
    第一步:製作一個.net平台下的menu控制項
  
    .net平台下面的自訂控制項的工作原理如下:控制項對應於一個類(class),控制項的所有屬性通過類的成員變數來暴露,而控制項的方法對應於class的成員函數。在控制項被載入的手,系統會調用class的render方法,製作控制項的時候,應該重載(override)這個render方法,使得在控制項被載入的那 一刻,控制項可以自己“繪製”自己,一般來說,在render方法裡面要將關於控制項介面繪製的那些javascript檔案放入到輸出資料流中。
  
    由於這裡重要是講解後面XML的應用,所以這裡只是把自訂控制項的原來簡要說明一下,下面羅列出相關對象,屬性,方法。
  
    整個menu控制項分為Topmenu,Submenu,Childrenmenu,MenuItem四個對象,其相應的資訊為:
  
    控制項屬性:
  
     ID:標識控制項名字
  
     MenubarHeight:菜單攔的高度
  
     MenubarWidth::菜單攔的寬度
  
     BorderWidth::邊框寬
  
     AutoDropdown:true表示自動下拉,false表是單擊滑鼠下拉
  
     DropdownDelay:下拉時間
  
     Menufont:字型
  
     LocationX:菜單的x位置
  
     LocationY:菜單的y位置
  
     XmlFile:xml檔案
  
     XmlStream:xml流
  
     topmenu對象屬性:
  
     ID:同上
  
     Text:頂層菜單的文本
  
     Isparent:true表示有下一級菜單,否則為false(false預設)
  
     Islink:需要用事件處理用true,否則false(false預設);
  
     Bgcolor:背景色
  
     Forecolor:前景色彩
  
     HoveredBackcolor:滑鼠放在上面的顏色
  
     Topmenufont:字型
  
     Linkurl:當isparent為false才有效,表示串連的url
  
     Borderwidth:topmenu的邊框寬
  
     Itemheight:下一級菜單的高度(必須isparent為true才有效)
  
     Itemwidth: 下一級菜單的寬度(必須isparent為true才有效)
  
     Submenus:含有下一級菜單的數組列表
  
     Submenu,Childrenmenu 和MenuItem的所有屬性跟上面Topmenu一樣,這裡就不贅述了。
  第二步,就是加入XML特性
  
    注意,任何xml文檔在其被處理之前最好先進行有效性驗證,提供驗證一般有兩種重要的途徑。其一就是提供DTD(文件類型定義),實際上就是讓使用者提供指令集,然後在xml文檔載入的時候對其進行有效性分析,看是否有無效指令,簡單說就是建立一個編譯環境;另外一個就是提供一個所謂的schema。.其作用跟DTD完全一樣,只是在表現形式上好於DTD,因為它本身也是一個XML文檔。這裡我採用了schema的形式,當然了,讀者用興趣也可以將其替換問相應的DTD版本。下面列出該schema的關於控制項和topmenu對象的代碼,如果要看該文檔的詳細代碼,請看 “代碼.doc”。
  
    menu.xdr:
  
  <?xml version="1.0" encoding="UTF-8"?>
  
  <Schema name="menus" xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-microsoft-com:datatypes">
  
  <description>
  
  menus schema used to validate menu.xml
  
  </description>
  
  <ElementType name="menu" model="closed" content="empty">
  
  <AttributeType name="id" dt:type="string" required="yes"/>
  
  <atttibute type="id"/>
  
  <element name="topmenu" model="closed" minOccurs="0" maxOccurs="*" content="empty"/>
  
  </ElementType>
  
  
  
  <ElementType name="topmenu" model="closed" content="empty">
  
  <AttributeType name="id" dt:type="string" required="yes"/>
  
  <AttributeType name="text" dt:type="string" required="yes"/>
  
  <AttributeType name="linkurl" dt:type="string" required="yes"/>
  
  <AttributeType name="isparent" dt:type="string" required="yes"/>
  
  <atttibute type="id"/>
  
  <atttibute type="text"/>
  
  <atttibute type="linkurl"/>
  
  <atttibute type="isparent"/>
  
  <element name="submenu" model="closed" minOccurs="0" maxOccurs="*" content="empty"/>
  
  </ElementType>
  
  
  
  <ElementType name="submenu" model="closed" content="empty">
  
  <AttributeType name="id" dt:type="string" required="yes"/>
  
  <AttributeType name="text" dt:type="string" required="yes"/>
  
  <AttributeType name="linkurl" dt:type="string" required="yes"/>
  
  <AttributeType name="isparent" dt:type="string" required="yes"/>
  
  <atttibute type="id"/>
  
  <atttibute type="text"/>
  
  <atttibute type="linkurl"/>
  
  <atttibute type="isparent"/>
  
  <element name="childrenmenu" model="closed" minOccurs="0" maxOccurs="*" content="empty"/>
  
  </ElementType>
  
  
  
  <ElementType name="childrenmenu" model="closed" content="empty">
  
  <AttributeType name="id" dt:type="string" required="yes"/>
  
  <AttributeType name="text" dt:type="string" required="yes"/>
  
  <AttributeType name="linkurl" dt:type="string" required="yes"/>
  
  <AttributeType name="isparent" dt:type="string" required="yes"/>
  
  <atttibute type="id"/>
  
  <atttibute type="text"/>
  
  <atttibute type="linkurl"/>
  
  <atttibute type="isparent"/>
  
  <element name="menuitem" model="closed" minOccurs="0" maxOccurs="*" content="empty"/>
  
  </ElementType>
  
  <ElementType name="menuitem" model="closed" content="empty">
  
  <AttributeType name="id" dt:type="string" required="yes"/>
  
  <AttributeType name="text" dt:type="string" required="yes"/>
  
  <atttibute type="id"/>
  
  <atttibute type="text"/>
  
  </ElementType>
  
  </Schema>
  
    如果您對html比較熟悉的話,相信上面的代碼即使是以前沒有接觸過也應該清楚了,在.xdr中,有兩個對象,其一是元素,用首碼 ElementType 來定義,另外一個是該元素所對應的屬性,用首碼atttibuteTpye,定義完這兩個對象後,就是要將它們執行個體化,對應的首碼分別是Element 和atttibute,然後您就可以使用這兩種已經執行個體化了的對象,就象使用html中<a>,<l>,<body>,<head>等標記一樣。
  
    為了更加清晰的說明上面的代碼,我們這裡舉一個例子,相信讀者一目瞭然:
  
  <menus xmlns='x-schema:Menu.xdr'>
  
  <menu id='menuBar1'>
  
  <topmenu id="xjtu" text="xjtu" isparent="true" linkurl="xjtu"></topmenu>
  
  <submenu id="sina" text="sina" isparent="false" linkurl="sina"></submenu>
  
  <topmenu id="sohu" text="sohu" isparent="false" linkurl="sohu"></topmenu>
  
  </menu></menus>
  
  
    建立完xml文檔後,就要在程式裡面讀取xml文檔,這裡如果採用微軟的vs.net平台開發的話,建議可以使用XmlTextReader來讀取相關資訊,具體細節可以查閱MSDN。
  
    第三步:使用控制項
  
    建立完了menu控制項,現在就是在.net平台下面來使用它。首先要在vs.net平台下面編譯該控制項,如果編譯成功就可以使用它了。使用.net自訂控制項和使用一般的ActiveX控制項很相似,啟動vs.net平台下面的組件箱(可以直接在ToolBar上右擊滑鼠來得到),注意我們製作是不是基於COM組件,而是ASP.net組件,所以從這點上它與COM組件有本質的不同,通過Browse按鈕可以選擇該控制項對應的dll檔案,將其添加進你的工程。下面你還要在你的程式碼中加入下面的代碼(其他代碼略)
  
    using 你的名字空間 ; (A)
  
    還應該在behind code加入該控制項的聲明 (B)
  
    事實上,無論是A處的代碼還是B處的說明,都可以由VS.NET平台自動產生,如果使用其他平台並且不支援這種代碼的自動添加的話,就可以手動添加。添加完之後,這樣就可以和其他控制項來進行使用了。而且在控制項類代碼中的所有的公有的成員變數,函數分別對應於控制項的屬性和方法。
  
    這裡需要指明的就是控制項必須提供兩個屬性,那就是XmlStream和XmlFile,如果使用者已經製作好了控制項的XML檔案(該檔案描述了控制項的資料),或者是已經寫好了一個xml代碼的話,可以把代碼和檔案分別傳給XmlStream和XmlFile,背景程式(就是dll檔案)通過調用一些XML的閱讀器比如XmlTextReader來讀取xml資料,這樣就達到了控制項支援xml屬性了,進而也增強了控制項的移植性和通用性。
  
    本文主要討論了xml在.net平台下控制項製作方面的應用,從上面的例子可以看出,xml在資料的整合,處理方面確實有它獨特的優勢,如果你的項目中涉及到資料處理和跨平台的問題,可以考慮應用XML.。
  



相關文章

Alibaba Cloud 10 Year Anniversary

With You, We are Shaping a Digital World, 2009-2019

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

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

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