结合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="
1<h2>error"&XmlDoc.parseerror.errorcode&"</h2>
"
strError=strError&XmlDoc.parseerror.reason&"
1<br/>
"
strError=strError&XmlDoc.parseerror.url&"
1<br/>
"
strError=strError&XmlDoc.parseerror.line&"
1<br/>
"
strError=strError&XmlDoc.parseerror.filepos&"
1<br/>
"
strError=strError&XmlDoc.parseerror.srcText&"
1<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 & "
1<select "="" &="" i="" id='Select"' width="1"></select>
" '每有一层就创建一个
1<select>
2s=s & ",'Select" & i & "'" '把每个<select>的id 保存在变量s,它的格式为:id1,id2,id3,id4
3
4next
5xmlDoc.save filename '正式保存Xml文件
6CloseXml xmlDoc '关闭Xml文件
7
8
9response.write ss '直接把<select>输出到文档
10s=mid(s,2)
11
12//在HTM文件内调用xmlselect.js
13<script language="JavaScript" src="xmlselect.js"></script>
14<script language="JavaScript">
15<!--//** power by fason
16function init() {
17var Sel = [```
18=s
19```];
20attachSelect("demo.xml", Sel,["论坛导航"]);
21};//-->
22</script>
23init();
24
25
26//#########我把它的JS代码贴出来,作者叫:蒲佛信,http://fason.nease.net/samples/xmlselect/这儿有示例和代码。
27
28//-----------------------------xmlselect.js文件开始-------------------------------
29
30//-----------------------------------------------------/
31// NichName :fason
32// Autho :Forbes Pu(蒲佛信)
33// Email :[email protected]
34// HomePage :http://fason.nease.net
35// Blog :http://blog.mvpcn.net/fason/
36// http://blog.csdn.net/fason/
37//
38// function :attachSelect(sXMLSrc, aSel[, sStore])
39// param1 :sXMLSrc(URL of XML data source)
40// param2 :aSel(array of SELECT controls's ID)
41// param3 :array of default value when display
42//-----------------------------------------------------/
43
44
45function attachSelect(sXMLSrc, aSel, sStore) {
46var oXML = CreateXmlDocument();
47var oDocument = null;
48var store = sStore ? sStore : [];
49var Sel = new Array();
50
51for (var i=0; i<asel.length; "",="" ".domdocument");="" "]";="" "onchange",="" &&="" ''),="" (!odocument)="" (!oxml){="" ()="" (doc.readystate="null)" (document.implementation="" (e)="" (el.addeventlistener)="" (el.attachevent)="" (nodes.length="" (oxml.readystate="4)" (sel[i].selectedindex+1)="" (typeof="" (typeof(odoc.selectsinglenode)!="undefined" (var="" (window.activexobject)="" )="" +="" 9,="" :[];="" ;="" ?="" a="" activexobject(prefix[i]="" addevent(el,="" addevent(sel[i],="" attachxml()="" attachxml();="" catch="" createxmldocument()="" data!');="" doc="oDoc.nodeType==9?oDoc:oDoc.ownerDocument;" doc.addeventlistener("load",="" doc.evaluate(spath,odoc,="" doc.onreadystatechange="function" doc.onreadystatechange();="" doc.readystate="4;" doc.setproperty("selectionlanguage","xpath");="" doc;="" dochange(0);="" dochange(n)="" dochange(x);="" document.implementation.createdocument)="" el="selectXMLNode(n);" el.addeventlistener(shandler.replace(="" el.attachevent(shandler,="" el.childnodes="" el[shandler]="fnc;" else="" error('no="" error('not="" f="0;" false);="" fnc)="" fnc);="" fnc,="" for="" function="" function(x)="" i="0;i<x;i++)" i++)="" i,="" if="" install="" new="" nodes="el" null).singlenodevalue;="" null);="" null;="" odoc="oDocument;" odoc.documentelement:odoc);="" odoc.selectsinglenode(spath);="" odocument="oXML.documentElement;" on="" oxml.load(sxmlsrc);="" oxml.onreadystatechange="function" parser');return;="" prefix='["MSXML3","MSXML2","MSXML","Microsoft"];' res="doc.createNSResolver(oDoc.nodeType==9?" res,="" return="" return;="" s="Sel[n];" sel[i]="document.getElementById(aSel[i]);" selectxmlnode(x)="" shandler,="" spath="" support!\nplease="" throw="" try="" var="" xml="" {="" {}="" }="" }(i+1));="" },="" };="">0) {
52with (s){
53length = 0;
54for (var i = 0,j = 0;i<nodes.length;i++) {
55if (nodes[i].nodeType!=1)continue;
56var t = nodes[i].getAttribute("text");
57var v = nodes[i].getAttribute("value") ? nodes
58
59[i].getAttribute("value") : t;
60if (v == store[n]) f = j;
61options[j++] = new Option(t, v);
62}
63options[f].selected = true;
64}
65if (++n<Sel.length) doChange(n);
66} else {
67for (var i=n; i<Sel.length; i++) {
68with (Sel[i]) {
69length = 0;
70options[0] = new Option('--');
71options[0].selected = true;
72}
73}
74}
75};
76};
77
78//-----------------------------xmlselect.js文件结束-------------------------------
79
80由于Xml的操作简便直接,使用起来得心应手。
81转自: http://goaler.xicp.net/ShowLog.asp?ID=426</asel.length;></select></select></select>