|
JavaScript读入XML的小问题讨论 |
|
说明:因为没有试过用中文系统地讨论技术问题,所以我的中文表达恐怕会有不妥当之处, 请包涵.
我在最近做的小项目里遇到一个问题:如何获取服务器端的数据在本地客户端及时生成图像.(服务器端的数据是变化的). 背景:服务器端使用XML存储数据,客户端读入数据,用JavaScript+VML(Vector Markup Language)画图,并且允许修改数据,以表格形式提交服务器端,更新XML文件. 限制:对XML文件的读入可以采用JScript 或VBScript书写; 但是为了用VML画图, 需要用JavaScript捕捉窗口长度,宽度等信息(无法用VBScript做到???), 所以最终的图中元素的大小尺寸及其他说明信息均必须用JavaScript形的变量. 问题:我首先使用VBScript写了一个画图程序,因为无法获得窗口大小信息,所以不能进行失量图的自由放缩, 最后放弃. 然后我用纯JavaScript写了从XML读入数据到画图的程序, 可以进行我需要的所有放缩动作, 但是,请注意,出现了一个很可笑的情况, 当我手动把服务器端的XML文件进行改动时, 客户端显示的仍然是未修改前的数据!而用VBScript写的程序则没有这样的问题,所获得的数据总能及时更新. 讨论:我同一个朋友讨论了一下, VBScript主要在服务器端工作,所以能获得实时数据; 而JavaScript/Jscript在客户端工作,不能捕捉到服务器端的实时数据. 解决方案:我想可不可以这样做呢, 先用VBScript 在服务器端获得实时数据, 传送给客户端, 再用JavaScript作图. 这就关系到了如何把VBScript的数组数据转化为JavaScript的数组数据. 虽然JavaScript中有VBArray方法强制转换, 但是经过我实际测试, 并不实用. 如果这样做就理想了: 1.首先从XML 读入数据(照一般方法); <% Dim strId Dim strFile StrFile="我的XML文件" Dim myxml Set myxml=Server.CreateObject("Microsoft.XMLDOM") myxml.async = false myxml.load (Server.Mappath(strFile)) 把你所需要的数据存入strId字符串(String)中,使用一个或任意个不会同数据混淆的分隔字符(例如: "?") nix="nothing" For Each prozess in myxml.getElementsByTagName ("prozess") '********strId*********** If isNull(prozess.Attributes.getNamedItem("id").nodeValue) Then strId=strId & nix & "?" Else strId=strId & prozess.Attributes.getNamedItem("id").nodeValue & "?" End If Next %> 2.这时我们有一个VBScript的字符串strId, 接下来我把这个字符串转化为JavaScript的数组. <script language=JavaScript> function getStrArray(str){ var mystr; mystr=str.split("?"); return(mystr); } function getIntArray(array){ var myarray=new Array(); for (i=0;i<array.length;i++){ if (array[i]=="undefine") myarray[i]=-1; else if(isNaN(parseInt(array[i]))==false) myarray[i]=parseInt(array[i]); } return myarray; } var id=new Array(); var stridtemp="<%=strId%>"; id=getStrArray(stridtemp);// 或者id=getIntArray(getStrArray(stridtemp)) </Script> 这样最后我就得到了一个含有实时数据信息的JavaScript数组. |