+ -
当前位置:首页 → 问答吧 → [讨论]抛砖引玉 js+dom操作xml快,还是xsl解释xml快

[讨论]抛砖引玉 js+dom操作xml快,还是xsl解释xml快

时间:2003-02-28

来源:互联网

呵呵,欢迎大家讨论
下面是操作xml的js+dom
var t1=new Date();
var xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async="false";
xmlDoc.load("xml.xml");
var nodes=xmlDoc.documentElement.childNodes;
var len=nodes.length,a=[];
for(var i=0;i<len;i++)a[i]=nodes.item(i).getAttribute("text");
a=a.join("");
document.write(a.length);
alert(new Date()-t1);

[ 本贴由 flashsoft 于 2003-2-28 17:48 最后编辑 ]

作者: flashsoft   发布时间: 2003-02-28

这个是那个xml文件
<?xml version="1.0" encoding="gb2312"?>
<?xml-stylesheet type="text/xsl" href="xml.xsl"?>
<catalog>
        <titles text="*" />
        <titles text="*" />
        <titles text="*" />
        <titles text="*" />
        <titles text="*" />
        <titles text="*" />
        <titles text="*" />
        <titles text="*" />
        <titles text="*" />
        <titles text="*" />
        <titles text="*" />
        <titles text="*" />
        <titles text="*" />
        <titles text="*" />
        <titles text="*" />
        <titles text="*" />
        <titles text="*" />
        <titles text="*" />
</catalog>
里面的数据自己增大
然后测试下
好像速度不快的说

作者: flashsoft   发布时间: 2003-02-28

这个是xsl解释xml的代码
<?xml version="1.0" encoding="GB2312"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<script language="JScript">
var t1=new Date();
var a="<xsl:for-each select="catalog/titles"><xsl:value-of select="@text" /></xsl:for-each>";
document.write(a.length);
alert(new Date()-t1);
</script>
</xsl:template>
</xsl:stylesheet>

作者: flashsoft   发布时间: 2003-02-28

三个代码的文件名分别为
xml.htm
xml.xml
xml.xsl
请大家测试下,并且讨论出一个较快的方法
^_^

作者: flashsoft   发布时间: 2003-02-28

xml 执行有效果,但 htm 执行怎么没反应

非常想学 xml ,但就是没找到怎么入门,有兴趣的和我一起学,我相信在无忧我一定能学会这玩意

作者: 风云突变   发布时间: 2003-02-28

少等,我传代码

作者: flashsoft   发布时间: 2003-02-28

xml.htm:基本在10-20之间。
xml.xml:基本在0-10之间,多次为0。

测试环境:win2kp+IE5.5

[ 本贴由 cawangjun 于 2003-2-28 17:51 最后编辑 ]

作者: cawangjun   发布时间: 2003-02-28

呵呵,xml的测试不准,不要评估,用感觉都知道,
你最好把数据增加到万条以上测试

作者: flashsoft   发布时间: 2003-02-28

20160条数据测试:

xml.htm:慢! 太慢! 66636多!

xml.xml:的确快! 基本保持不变,10-20。

作者: cawangjun   发布时间: 2003-02-28

怎么会这样?
==========================
无法显示 XML 页。
使用 XSL 样式表无法查看 XML 输入。请更正错误然后单击 刷新按钮,或以后重试。


--------------------------------------------------------------------------------

系统未找到指定的对象。处理资源 'file://E:\xml.xsl' 时出错。

作者: 剑啸狂沙   发布时间: 2003-03-01

哦,现在可以了,没看全,呵呵

作者: 剑啸狂沙   发布时间: 2003-03-01

18432 条
html:62620
xml:0

作者: 剑啸狂沙   发布时间: 2003-03-01

那么xml.htm
改为var t1=new Date();
var xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async="false";
xmlDoc.load("xml.xml");
var node=xmlDoc.documentElement.firstChild;
var a=[],i=-1;
do a[++i]=node.getAttribute("text");
while(node=node.nextSibling);
a=a.join("");
document.write(a.length);
alert(new Date()-t1);
试试

作者: flashsoft   发布时间: 2003-03-03



QUOTE:
js+dom操作xml快,还是xsl解释xml快

二者都是不能互换的技术,互相谈快慢不相及!
操作DOM适合在分析数据的场景,XSL转换XML适用于显示数据!

作者: not   发布时间: 2003-03-03

呵呵,not的说法是未必哦
用下面这个
var t1=new Date();
var xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async="false";
xmlDoc.load("xml.xml");
var node=xmlDoc.documentElement.firstChild;
var a=[],i=-1;
do a[++i]=node.getAttribute("text");
while(node=node.nextSibling);
a=a.join("");
document.write(a.length);
alert(new Date()-t1);

比xsl转换xml要来的快,那么不知你是用xsl转换还是用dom呢~
^_^

作者: flashsoft   发布时间: 2003-03-03

你写的这些都只是在IE中处理XML的代码,适用的场景也只限于HTML页面。

我在常规的开发中,XSLT在业务逻辑层上根本无用!
XPATH和DOM才是常用的!

作者: not   发布时间: 2003-03-03

呵呵,不同场合不同需要,
你说的也是未必的
`^_^

作者: flashsoft   发布时间: 2003-03-03



QUOTE:
[i]flashsoft[/i] 于 2003-3-3 10:23 AM 写道:
呵呵,不同场合不同需要,
你说的也是未必的
`^_^

愿闻其详

作者: not   发布时间: 2003-03-03

比如我现在做的项目就不适合XPATH和DOM

作者: flashsoft   发布时间: 2003-03-03

说来听听?

作者: not   发布时间: 2003-03-03

虽然我做的也是以表现为主,但是表现出来的形式是多种的
比如可能是以树出现,可能是以菜单出现,但是数据是一致的,那么你如果处理这个的时候肯定是做两种方式,但是js+dom就不必分开做

作者: flashsoft   发布时间: 2003-03-03

你还是在谈涉及Web Page的XML。

你描述的问题:
数据是XML文件
操作:显示XML(菜单、树)

在你谈的Web Page范围内,我选择的解决方案是XSL!

flashsoft,你对XML哪方面的技术了解比较好?
互相交流下,我用DOM和XPath比较多。
给个最近在对Exchange Server上做WebDAV编程的例子看下:

作者: not   发布时间: 2003-03-03

/// <summary>
                /// 获取用户的日历文件夹
                /// </summary>
                /// <param name="userid">用户名</param>
                /// <returns>用户的日历文件夹</returns>
                public static Uri GetCalendarFolder(string userid)
                {
                        Uri uri = null;
                        try
                        {
                                // 用户的根目录
                                Uri root = new Uri("http://" + host + "/exchange/" + userid);
                       
                                HttpWebRequest req = (HttpWebRequest)(WebRequest.CreateDefault(root));

                                // 准备查询头部
                                req.Method = "PROPFIND";
                                req.ContentType = "text/xml";
                                req.Credentials = new System.Net.NetworkCredential(user, password);

                                // 准备查询语句
                                string query = "<?xml version=\"1.0\" ?>" +
                                        "<D:propfind xmlns:D=\"DAV:\" xmlns:R=\"urn:schemas:httpmail:\">" +
                                        "<D:prop><R:calendar /></D:prop>" +
                                        "</D:propfind>";

                                req.ContentLength = GetContentLength(query);

                                // 准备查询体
                                StreamWriter sw = new StreamWriter(req.GetRequestStream());
                                sw.Write(query);
                                sw.Close();

                                // 获取查询结果
                                HttpWebResponse response = req.GetResponse() as HttpWebResponse;
                                string body = System.Web.HttpUtility.HtmlDecode(HttpHelper.GetBody(response));

                                // 解析查找结果
                                XmlDocument doc = new XmlDocument();
                                doc.LoadXml(body);

                                // 创建名称空间管理
                                XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
                                nsmgr.AddNamespace("b","urn:uuid:c2f41010-65b3-11d1-a29f-00aa00c14882/");
                                nsmgr.AddNamespace("d","urn:schemas:httpmail:");
                                nsmgr.AddNamespace("c","xml:");
                                nsmgr.AddNamespace("f","urn:schemas-microsoft-com:office:office");
                                nsmgr.AddNamespace("a","DAV:");

                                XmlNode ncalendar = doc.SelectSingleNode("/a:multistatus/a:response/a:propstat/a:prop/d:calendar", nsmgr);

                                uri = new Uri(ncalendar.InnerText);
                        }
                        catch(WebException e)
                        {
                                EventLogHelper.Write("ExchangeHelper", e.Message, EventLogEntryType.Error);
                        }

                        return uri;
                }

作者: not   发布时间: 2003-03-03

返回的XML文件如下:

<?xml version="1.0"?>
<a:multistatus xmlns:b="urn:uuid:c2f41010-65b3-11d1-a29f-00aa00c14882/" xmlns:d="urn:schemas:httpmail:" xmlns:c="xml:" xmlns:e="urn:schemas-microsoft-com:office:office" xmlns:a="DAV:">
  <a:response>
    <a:href>http://hw1/exchange/jiangjs/</a:href>
    <a:propstat>
      <a:status>HTTP/1.1 200 OK</a:status>
      <a:prop>
        <d:calendar>http://hw1/exchange/jiangjs/日历</d:calendar>
      </a:prop>
    </a:propstat>
  </a:response>
  <a:response>
    <a:href>http://hw1/exchange/jiangjs/收件箱/RE: ReminderForExchange代码.EML</a:href>
    <a:propstat>
      <a:status>HTTP/1.1 404 Resource Not Found</a:status>
      <a:prop>
        <d:calendar />
      </a:prop>
    </a:propstat>
  </a:response>
  <a:response>
    <a:href>http://hw1/exchange/jiangjs/收件箱/答复: Bluetooth 成了过时的名词。-2.EML</a:href>
    <a:propstat>
      <a:status>HTTP/1.1 404 Resource Not Found</a:status>
      <a:prop>
        <d:calendar />
      </a:prop>
    </a:propstat>
  </a:response>
</a:multistatus>

作者: not   发布时间: 2003-03-03

啊,不懂你说的呢`
~O~

作者: flashsoft   发布时间: 2003-03-03

那是C#的代码。搞JS的人能看懂的!

作者: not   发布时间: 2003-03-03

上面c#做的
只是生成xml代码而已
实际应用呢

作者: flashsoft   发布时间: 2003-03-03

你没有看清楚,并不是生成XML代码!
是从一个XML代码中提取一个有用的信息!
这个就是实际应用!

作者: not   发布时间: 2003-03-03

然后在表现出来,然而这个必须是服务器端支持
用js+dom算是在客户端的啦~

作者: flashsoft   发布时间: 2003-03-03



QUOTE:
[i]flashsoft[/i] 于 2003-3-3 11:37 AM 写道:
然后在表现出来,然而这个必须是服务器端支持
用js+dom算是在客户端的啦~

GetCalendarFolder返回的是一个Uri不需要显示,表现不一定是Web Page。
我开发的大多数情况都是XML存储的数据!
而不是把XML显示在Web Page里。

我管那个叫业务逻辑层,不一定是服务器端。
它本身就是一个应用程序。

Web Page里的DOM、JS、XSL都只是在IE上面跑跑!

作者: not   发布时间: 2003-03-03

明白了

作者: flashsoft   发布时间: 2003-03-03

人人都说XML耗费资源
我正在学哦……
太打击积极性了……
不过这么看来XML也不慢

作者: 沙滩凉鞋   发布时间: 2003-03-04

学习XML有哪些好处呢?

作者: 52it   发布时间: 2003-03-04

xsl可以转换XML为标准的html文档,而且可以转换代码,js+dom可就麻烦了。

例如: <xsl:output method="html" encoding="UTF-8" indent="yes"/>。

作者: netel   发布时间: 2003-03-26

DOM is slowly.

作者: imafool   发布时间: 2003-04-03

帖子我没读完
看了看标题和第一篇代码
因为使用的引擎不一样
如果真的需要解析 xml
我个人推荐使用 xslt 而不是 dom
dom 因为考虑兼容性问题会延缓处理进度
另外对楼主的一个建议:
如果你已经安装了 XML4 或者其他版本
请使用 new ActiveXObject("Msxml2.DOMDocument.4.0")
而不是标准的 new ActiveXObject("Microsoft.XMLDOM")
因为 XML4 是共存方式安装的
你这么写代码调用的 XML2.6 (?) 的引擎
因为引擎的不成熟,所耗费更多的时间也是一个因素
至于第 14 楼 卵 的说法,我个人不是很赞同
xslt 的应用不仅仅于显示或转换
如果你用 java 写程序会有这个体会
尝试首先使用特定的 xslt 过滤 xml 代码,再让 sax 来分析过滤以后的 xml 代码
执行时间的压缩和 xml 的扩大肯定不成正比
因为 xslt 解析 xml 想比 sax 和 dom 是最快的
这一点 wrox 的作者和 xml.net 里面都测试过
欢迎大家对我 post 里面的错误指正

作者: snakevil   发布时间: 2003-04-16

pat
原来 卵 是 51js 现在的级别评定
papaya
不过 flashsoft 居然还在坛子里奋斗不息
敬仰滔滔不绝
我曾经的偶像
大家一起努力吧

plus
偶极度不赞同 沙滩凉鞋 的说法
不知道 你试过 sql 和 xml 没有
sql 所占用的资源足够同时运行 3-4 个 xml 元
至于 oracle 和 db2
大家可以自己测试一下
好的 xml 组合在我看来是无敌的
建议尽量使用 xslt 而不是与其他技术兼容的 dom 或者 sax
建议在 xslt 代码里面尽量不要使用到 script 标签
xslt 里面每一个函数的执行周期和 script 里面每一个指令的执行周期大体相同
自己算算看是用 20 个 xslt 函数实现划算还是包含了 10 句的 script 函数实现划算吧

作者: snakevil   发布时间: 2003-04-16

倒~~~~
真的要考虑效率的话,考虑的地方实在太多了

作者: flashsoft   发布时间: 2003-05-14

相关阅读 更多

热门下载

更多