新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论SVG, GML, X3D, VRML, VML, XAML, AVALON, Batik等基于XML的图形技术,以及有关GIS的应用。
    [返回] 中文XML论坛 - 专业的XML技术讨论区XML.ORG.CN讨论区 - 高级XML应用『 SVG/GML/VRML/X3D/XAML 』 → SVG parseXML故障 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 8666 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: SVG parseXML故障 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     Cwjnet 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:7
      积分:77
      门派:XML.ORG.CN
      注册:2010/3/7

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给Cwjnet发送一个短消息 把Cwjnet加入好友 查看Cwjnet的个人资料 搜索Cwjnet在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 引用回复这个贴子 回复这个贴子 查看Cwjnet的博客楼主
    发贴心情 SVG parseXML故障

    function attrCallback(data) {
        if (data.success) {
            var unit = parseXML(data.content, svgDoc);
            var id = get_attr_value(unit, "", "id");
            var unit2 = svgDoc.getElementById(id);
            if (!unit2) alert("undefined:" + id);
            //为了说明问题出现在parseXML语句上,下面这一条语句屏蔽后同样会出错。
            //这一句是真正需要用的。
            //unit2.parentNode.replaceChild(unit.firstChild, unit2);
        }
        else {
            alert("success="+data.success);
        }
    }
    请看以上代码,目的是想从服务器接收SVG图形数据,然后显示在界面上。
    这段代码是可以用的,但是执行几次以后就不正常了。
    经过很多调试以后才发现问题出现在var unit = parseXML(data.content, svgDoc);
    在多次执行以后parseXML转换的unit对象不再完整了,
    虽然unit对象还在,并且printNode(unit)的内容结果也和预期的一样,
    但是unit的结构已经不完整了,本来应该有的子节点可以会没有了一部分。
    不知道哪位高手能够解释一下这个parseXML到底是怎么回事。
    是否和内存泄露、parseXML有状态等有关?


    [此贴子已经被作者于2010-3-8 21:36:55编辑过]

       收藏   分享  
    顶(0)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2010/3/7 15:01:00
     
     Cwjnet 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:7
      积分:77
      门派:XML.ORG.CN
      注册:2010/3/7

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给Cwjnet发送一个短消息 把Cwjnet加入好友 查看Cwjnet的个人资料 搜索Cwjnet在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 引用回复这个贴子 回复这个贴子 查看Cwjnet的博客2
    发贴心情 
    var unit = parseXML(data.content, svgDoc); //.firstChild; //.getDocumentElement();//,svgDoc);
            if (!get_attr_value(unit, "metadata/custom", "Type")) {
                alert("parseXML failed\r\n" + unit + "," + unit.parentNode + "\r\n" + printNode(unit));
                return;
            }
            //代码到这里时说明parseXML转换是成功的
            //get_attr_value(unit, "metadata/custom", "Type")是一个自定义的函数,
            //就是从unit结构中取一个预期的数据项,
            //如果能够取到数据,说明unit结果是完整的,否则就是不完整的。
            //但是很奇怪,通过printNode(unit)打印显示的结果,内容还是完整的。
            //为了避免代码在别的地方引入错误
            //我特意将这一段转换成功的数据进行重复转换,
            //最后在点击5、6次到20来次不等的次数里就会捕获到错误。
            //而且测试越到后来错误的概率会越来越多,直到再也不能成功转换。
            //好像某一种垃圾在parseXML内部留下来了。
            while (confirm("parseXML ok\r\n" + unit + "\r\n" + printNode(unit))) {
                unit = parseXML(data.content, svgDoc);
                if (!get_attr_value(unit, "metadata/custom", "Type")) {
                    alert("parseXML failed\r\n" + unit + "," + unit.parentNode + "\r\n" + printNode(unit));
                    return;
                }
            }
            var id = get_attr_value(unit, "", "id");

    有哪一位高人请指点一下啊,这到底是什么问题?
    会不会和unit的数据结构有关?因为我这里面是有id的,有onclick等事件的,
    普通的parseXML教材例子中都没有这些内容,会不会是有这种限制?
    因为id整个SVG文档是需要唯一的,所以parseXML再重构unit时和原图上的id冲突导致
    不能正常转换了。或者onclick等事件的包还也会产生影响?
    因为教科书上说unit.addEventListener()函数是绑定事件“唯一真正的标准方式”,
    而我显然没用到addEventListener这个函数。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2010/3/8 13:47:00
     
     Cwjnet 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:7
      积分:77
      门派:XML.ORG.CN
      注册:2010/3/7

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给Cwjnet发送一个短消息 把Cwjnet加入好友 查看Cwjnet的个人资料 搜索Cwjnet在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 引用回复这个贴子 回复这个贴子 查看Cwjnet的博客3
    发贴心情 
    上面这段代码如果把
    unit = parseXML(data.content, svgDoc);
    改成
    unit = parseXML(data.content);//, svgDoc);
    则不会有任何故障,任意转换多少次都没问题。
    只是到了下面
    unit2.parentNode.replaceChild(unit.firstChild, unit2);
    的时候就不能用了,报了一个文档错误,因为
    unit = parseXML(data.content, svgDoc);
    转换出来的是SVGElement类型,是
    unit2.parentNode.replaceChild(unit.firstChild, unit2);
    可以使用的类型,而
    unit = parseXML(data.content);//, svgDoc);
    转换出来的是Element类型,没法被replaceChild接受。
    一种是能转换但是不能替换,一种是能替换却不能正常转换,晕倒。我用的是SVGView3.03版本。
    我就搞不懂了adobe公司为什么要把这东西搞的怎么复杂啊,设置一个菜单也是这样。
    是不是故意这样子整的啊,弄得我们不能正常使用SVG,只好去用flash了。

    这里好像能回答问题的人不多啊,还是我的问题太难了?

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2010/3/17 13:01:00
     
     Cwjnet 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:7
      积分:77
      门派:XML.ORG.CN
      注册:2010/3/7

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给Cwjnet发送一个短消息 把Cwjnet加入好友 查看Cwjnet的个人资料 搜索Cwjnet在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 引用回复这个贴子 回复这个贴子 查看Cwjnet的博客4
    发贴心情 
    已经解决。SVG有一个调用父窗口脚本的功能,
    我可以把请求的命令提交给宿主窗口的脚本来实现,
    在宿主窗口中利用jquery的ajax技术获取xml数据,然后编写一个n=createNode(xml,svgdoc)函数来创建一个等效的svg节点,就可以使用unit.parentNode.replaceChild(n,unit)成功替换了。
    欢迎SVG开发者前来技术交流。

    再次鄙视adobe公司。parseXML是一个挂羊头卖狗肉的东西。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2010/3/19 11:27:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/5/6 2:18:52

    本主题贴数4,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    78.125ms