结合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)
//在htm文件内调用xmlselect.js
<script language=javascript src="xmlselect.js"></script>
<script language=javascript>
<!–//** power by fason
function init() {
var sel = [<%=s%>];
attachselect("demo.xml", sel,["论坛导航"]);
};//–>
</script>
init();
//#########我把它的js代码贴出来,作者叫:蒲佛信,http://fason.nease.net/samples/xmlselect/这儿有示例和代码。
//—————————–xmlselect.js文件开始——————————-
//—————————————————–/
// nichname :fason
// autho :forbes pu(蒲佛信)
// email :fason_pfx@hotmail.com
// homepage :http://fason.nease.net
// blog :http://blog.mvpcn.net/fason/
// http://blog.csdn.net/fason/
//
// function :attachselect(sxmlsrc, asel[, sstore])
// param1 :sxmlsrc(url of xml data source)
// param2 :asel(array of select controlss id)
// param3 :array of default value when display
//—————————————————–/
function attachselect(sxmlsrc, asel, sstore) {
var oxml = createxmldocument();
var odocument = null;
var store = sstore ? sstore : [];
var sel = new array();
for (var i=0; i<asel.length; i++)
sel[i] = document.getelementbyid(asel[i]);
if (!oxml){ throw new error(not support!\nplease install a xml parser);return; }
oxml.onreadystatechange = function () {
if (oxml.readystate == 4) {
attachxml();
}
};
oxml.load(sxmlsrc);
function createxmldocument() {
if (document.implementation && document.implementation.createdocument) {
var doc = document.implementation.createdocument("", "", null);
if (doc.readystate == null) {
doc.readystate = 1;
doc.addeventlistener("load", function () {
doc.readystate = 4;
if (typeof doc.onreadystatechange == "function")
doc.onreadystatechange();
}, false);
}
return doc;
}
else if (window.activexobject) {
var prefix = ["msxml3","msxml2","msxml","microsoft"];
for (var i=0;i<prefix.length;i++) {
try {
var doc = new activexobject(prefix[i] +
".domdocument");
doc.setproperty("selectionlanguage","xpath");
return doc;
} catch (e) {}
}
}
return null;
};
function attachxml() {
odocument = oxml.documentelement;
if (!odocument) { throw new error(no xml data!); return; }
for (var i=0;i<asel.length-1;i++){
addevent(sel[i], "onchange", function(x) {
return function () { dochange(x); }
}(i+1));
}
dochange(0);
};
function selectxmlnode(x) {
var spath = "/*";
var odoc = odocument;
for (var i=0;i<x;i++)
spath += "/*[" + (sel[i].selectedindex+1) + "]";
if (typeof(odoc.selectsinglenode)!=undefined) return
odoc.selectsinglenode(spath);
else {
var doc=odoc.nodetype==9?odoc:odoc.ownerdocument;
var res = doc.creatensresolver(odoc.nodetype==9?
odoc.documentelement:odoc);
return doc.evaluate(spath,odoc, res, 9, null).singlenodevalue;
}
};
function addevent(el, shandler, fnc) {
if (el.attachevent) {
el.attachevent(shandler, fnc);
} else if (el.addeventlistener) {
el.addeventlistener(shandler.replace(/on/i, ), fnc, false);
} else {
el[shandler] = fnc;
}
};
function dochange(n) {
var el = selectxmlnode(n);
var nodes = el ? el.childnodes :[];
var s = sel[n];
var f = 0;
if (nodes.length>0) {
with (s){
length = 0;
for (var i = 0,j = 0;i<nodes.length;i++) {
if (nodes[i].nodetype!=1)continue;
var t = nodes[i].getattribute("text");
var v = nodes[i].getattribute("value") ? nodes
[i].getattribute("value") : t;
if (v == store[n]) f = j;
options[j++] = new option(t, v);
}
options[f].selected = true;
}
if (++n<sel.length) dochange(n);
} else {
for (var i=n; i<sel.length; i++) {
with (sel[i]) {
length = 0;
options[0] = new option(–);
options[0].selected = true;
}
}
}
};
};
//—————————–xmlselect.js文件结束——————————-
由于xml的操作简便直接,使用起来得心应手。
