xml|菜單|動態|聯動菜單|xml|菜單|聯動菜單 我做某個項目時,有需求的是做一個動態無限級的聯動菜單。由於本人比較懶於是上網找找有關的代碼,但很多都沒有滿足需求,其中有一編文章是用JavaScript對XML檔案操作來實現無限級聯動菜單的,我們可結合ASP來完成對資料庫值的讀取,然後寫入XML檔案,再用JavaScript讀出來並且控制它的聯動。
這兒的關鍵是把資料庫內的N層資料類讀出來:
我的資料庫表結構是這樣的:
'tbl_Class
列名 資料類型 長度 說明
ClassID int 4 類ID
ModuleID int 4 模組ID
GroupID int 2 標識一個組
ClassName nvarchar 50 類別名稱
ParentID int 2 串連到組(0表示是父類)
'####################################我的ASP代碼如下##########################################
'我把串連資料庫的代碼忽略。
'函數名字:OpenXml(FileName)
'入口參數: filename 需要串連或開啟的xml檔案名稱
'傳回值 :XmlDoc就是一個成功裝載XML文檔的對象了。
' 有錯誤則列印錯誤資訊strError
'------------------------------------------------
function OpenXml(filename)
dim strSourceFile ,XmlDoc,strError
strSourceFile = filename
Set XmlDoc = Server.CreateObject("Microsoft.XMLDOM") '建立XMLDOM執行個體
XmlDoc.async = false
XmlDoc.load(strSourceFile)
OpenXml=XmlDoc.parseerror.errorcode
if XmlDoc.parseerror.errorcode<>0 then
strError="<h2>error"&XmlDoc.parseerror.errorcode&"</h2>"
strError=strError&XmlDoc.parseerror.reason&"<br>"
strError=strError&XmlDoc.parseerror.url&"<br>"
strError=strError&XmlDoc.parseerror.line&"<br>"
strError=strError&XmlDoc.parseerror.filepos&"<br>"
strError=strError&XmlDoc.parseerror.srcText&"<br>"
response.write strError '輸出錯誤
else
set OpenXml=XmlDoc '返回執行個體
end if
end function
'------------------------------------------------
'函數名字:CloseXml()
'參數: XmlDoc XML組件執行個體
'------------------------------------------------
function CloseXml(XmlDoc)
if IsObject(XmlDoc) then
set XmlDoc=nothing
end if
end function
'------------------------------------------------
'函數名字:SelectXmlNode
'參數:XmlDoc XML組件執行個體
' e 元素的名字
'返回元素執行個體
'------------------------------------------------
function SelectXmlNode(XmlDoc,e)
dim n
set n=XmlDoc.selectSingleNode("//" & e )
set selectXmlNode= n
end function
Dim n,np,MaxGroup,root,xmlDoc,nt,filename,s,ss,TorF
filename=server.mappath("demo.xml")
set xmlDoc=openXML(filename)'開啟XML
RemoveAllNodes xmlDoc,"Root"'把Root和它下面的子項清除,這樣可以多次方便讀寫
set root= xmlDoc.createElement("Root")
xmlDoc.appendChild root'建立一個頂層元素
sql="select Max(GroupID) from tbl_Class " '讀出最大的層次
set rs=cn.execute(sql)
if isnull(rs(0)) then MaxGroup=0 else MaxGroup=rs(0) '如果為null 表示沒有資料
s="":ss=""
set nt=xmldoc.createElement("item")
nt.setAttribute "text", "請選擇"
root.appendChild nt '建立一個元素
for i=1 to MaxGroup '開始迴圈
sql="select * from tbl_Class where GroupID=" & i '由底層向頂層讀取
set rs=cn.execute(sql)
TorF=False '為了每一個層上都建立一個“請選擇”的空取。
do while rs.eof =false '開始讀取下層的資料
Set n = xmlDoc.createElement("item" & rs("ClassID")) '建立一個命名為item + ID號的標記元素
n.setAttribute "text",rs("ClassName")'把它的屬性“text”設定為資料庫表內的
ClassName
n.setAttribute "value",rs("ClassID")'把它的屬性“value”設定為資料庫表內的
ClassID
if rs("ParentID")>0 then '是有上層資料的
set np=selectXmlNode(xmlDoc,"item" & rs("ParentID")) '把它的上層資料元素先讀出儲存在np
if TorF=false then '如果TorF為False值時
set nt=xmldoc.createElement("item") '建立一個元素儲存在nt
nt.setAttribute "text", "請選擇"'把它的text屬性設定為“請選擇”
np.appendChild nt 'np把它加為子項目
end if
TorF=true '設定true
np.appendChild n 'np 把n加為子項目
else
root.appendChild n '如果是第一層資料就把它加入為root下的一個子項目
end if
rs.movenext '下一條指標
loop
ss=ss & "<SELECT id=Select" & i & " width=1 ></SELECT></span>" '每有一層就建立一個
<select>
s=s & ",'Select" & i & "'" '把每個<select>的id 儲存在變數s,它的格式為:id1,id2,id3,id4
next
xmlDoc.save filename '正式儲存Xml檔案
CloseXml xmlDoc '關閉Xml檔案
response.write ss '直接把<select>輸出到文檔
s=mid(s,2)