• 2006-12-29

    actionscript远程读取xml文件

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://junewong.blogbus.com/logs/4160488.html

        这两天需要将一个flash的播放器里面的配置项移出来改为用独立的xml文件作配置。

        我这个半路出家的actionscript程序员还是第一次用到XML这个类。看了一下文档,在本地上用testXml.load("test.xml","GET")很快就Load进一个文件进行解析。于是将整个播放器的全局变量都改写,移到新建的xml文档中。传上服务器的文件夹之后,调试表明居然是莫名其妙地Load进其他的xml文件了。load进来的xml是我以前已经修改过的xml文件,可以保证服务器上没有这个文件。

        重新查看文档,明白到要远程加载xml文件需要输入的参数一定要是Url路径的。原来加载到的那个xml,估计是客户端和下载到本地磁盘的swf文件在同个临时文件夹中的重名文件。那确实是难得的巧合,让我疑神疑鬼了很久。

        新的问题是如果要把本是配置项的url路径写进flash文件,那么还要配置文件来干什么?只能找些取巧点的方法了。

        在帮助文档中找到个方法,用Movie._url属性能获取该影片的url路径。于是用这个属性来获取运行的swf文件的url,将配置的xml文件与swf文件放在同一个目录下,用字符串改成xml文件的路径就是了:

        var url_this=_root._url;
        var url_dir=url_this.substring(0,url_this.lastIndexOf("/")+1);
        var url_config=url_dir+"config.xml";

        传上服务器后是OK的。

        不过AS2.0的XML类也有比较烦人的地方,比如查找xml节点比较麻烦,如果用XPath需要引进import com.xfactorstudio.xml.xpath.*;的组件,很别扭,好在flash8的客户端程序还有个新属性:idMap,能通过id直接查找节点,非常好用。

        var testXml1=new XML();
        testXml1.ignoreWhite=true;
        testXml1.load=("http://.../.../test.xml","GET");

        testXml1.onData=function(src:String){
           var testXml2=new XML();
           testXml2.parseXML(src);
           var value=testXml2.idMap["testId"].firstChild.nodeValue;
           …………
        };

        不过可惜FMS服务器端写asc文件就没这些优待了。还是得通过节点上下文的关系查找。

        另外最让我头疼的还是xml的加载是异步的,XML对象通过load进一个xml文件之后,要等待onData事件被触发后才能将xm文件的信息提取出来。这个时候事件之外的程序早就执行完了。不过一般情况下都不会恼人,因为事件驱动本来也是个优点,可以让onData里面拿到配置文件的数据后才调用主函数启动应用程序。不过不幸的是我的程序的情况是不允许这样做,只好使用土方法:用一个定时器每0.1秒检查一下xml文件Load完了没有,等load完了才执行主函数:

        function startApp(){
            if(testXml.loaded){
                clearInterval(intevalID);
                Main();
            }
        }      
        var intevalID=setInterval(this,"startApp",100)

        这方法是有效。不过到了FMS的服务器端程序中就不能这样用了。因为服务器端的配置文件是要求在应用程序被加载时触发的事件application.onAppStart()中进行读取的。而很可能配置项还没读完,客户端已经开始连接,application.onConnect()也被触发了,那么onAppStart中所要执行的用户验证等动作都没完成,客户端也就收到“连接失败”的信息。

        暂时没想到什么很好的解决方法。当然,可以用上面的方法变通一下,改为让客户端的flash多尝试几次连接,连接超过几次返回错误才提示用户连接失败。

        总之,将flash程序改为用xml做配置文件会遭遇这么多麻烦的问题,我事先是没预料到的。

    收藏到:Del.icio.us




    Tag:Flash 编程